在 Windows 下,可以使用以下方法来监控一个文件是否被修改:

  1. 使用 ReadDirectoryChangesW 函数:

    • 使用 CreateFile 函数打开要监控的文件或目录,并获得一个文件句柄。
    • 使用 ReadDirectoryChangesW 函数监视文件句柄,设置回调函数来处理文件变化事件。
    • 在回调函数中处理文件被修改的情况。
    #include <Windows.h>
    
    VOID CALLBACK FileChangeCallback(DWORD dwErrorCode, DWORD dwBytesTransfered, LPOVERLAPPED lpOverlapped)
    {
        // 处理文件被修改的情况
        // ...
    }
    
    int main()
    {
        HANDLE hDir = CreateFileW(L'path_to_file', FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
        if (hDir == INVALID_HANDLE_VALUE)
        {
            // 处理文件打开失败的情况
            return 1;
        }
    
        BYTE buffer[4096];
        OVERLAPPED overlapped;
        ZeroMemory(&overlapped, sizeof(overlapped));
        overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    
        if (ReadDirectoryChangesW(hDir, buffer, sizeof(buffer), TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE, NULL, &overlapped, FileChangeCallback))
        {
            // 监控成功,等待回调函数被触发
            WaitForSingleObject(overlapped.hEvent, INFINITE);
        }
        else
        {
            // 处理监控失败的情况
        }
    
        CloseHandle(overlapped.hEvent);
        CloseHandle(hDir);
    
        return 0;
    }
    
  2. 使用 FindFirstChangeNotification 函数:

    • 使用 CreateFile 函数打开要监控的文件或目录,并获得一个文件句柄。
    • 使用 FindFirstChangeNotification 函数监视文件句柄,设置要监视的事件类型。
    • 使用 WaitForSingleObject 函数等待文件变化事件的发生。
    • 在文件变化事件发生后,使用 FindNextChangeNotification 函数继续监视文件变化事件。
    #include <Windows.h>
    
    int main()
    {
        HANDLE hDir = CreateFileW(L'path_to_file', FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
        if (hDir == INVALID_HANDLE_VALUE)
        {
            // 处理文件打开失败的情况
            return 1;
        }
    
        HANDLE hChange = FindFirstChangeNotificationW(L'path_to_file', TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE);
        if (hChange == INVALID_HANDLE_VALUE)
        {
            // 处理监控失败的情况
        }
    
        // 等待文件变化事件的发生
        WaitForSingleObject(hChange, INFINITE);
    
        // 处理文件被修改的情况
        // ...
    
        FindNextChangeNotification(hChange);
    
        CloseHandle(hChange);
        CloseHandle(hDir);
    
        return 0;
    }
    

这些方法可以监控文件的最后写入时间(FILE_NOTIFY_CHANGE_LAST_WRITE),当文件被修改时,会触发回调函数或发出通知。你可以根据具体的需求选择适合的方法。

Windows C++ 文件修改监控方法

原文地址: https://www.cveoy.top/t/topic/pd62 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录