使用 C++ 监视文件更新

monitoring file update using c++

在 c++ 中使用 windows api 我如何监视文件更改事件

赞:"this_program.py" 正在更新文本文件。

outfile.open("some_file_1.txt",ios::out);

所以我可以监控文件系统上的文件更改,使用 winapi 或 c++ 中的 mfc 或 python.

监听什么事件,比如如何设置hook获取源文件

outfile.close();

没有针对此的特定 MFC 选项(据我所知)。您可以使用 FindFirstChangeNotification 来监视整个文件夹的更改。如果检测到更改,则您的文件可能已更改(或者可能是另一个文件已更改)。阅读文件上的 date/time 标记以查看是否发生更改。另一个函数是 ReadDirectoryChanges,它有更多的选项。它不会告诉您谁更改了文件。

HWND hMainWnd;
FILETIME SaveFileTime;

DWORD WINAPI checkfolder(void* arg)
{
    wchar_t folder[MAX_PATH];
    lstrcpy(folder, (const wchar_t*)arg);

    for (;;)
    {
        HANDLE hfolder = FindFirstChangeNotification(folder, FALSE,
                FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME);
        WaitForSingleObject(hfolder, INFINITE);
        if (!::IsWindow(hMainWnd)) break;
        PostMessage(hMainWnd, WM_COMMAND, ID_MY_MESSAGE, 0);
        FindCloseChangeNotification(hfolder);
    }
    return 0;
}

int main(...)
{
    //save last write time
    WIN32_FIND_DATA data;
    HANDLE h = FindFirstFile(L"c:\test\file.txt", &data);
    if (h != INVALID_HANDLE_VALUE) SaveFileTime = data.ftLastWriteTime;
    FindClose(h);

    //watch for changes
    CreateThread(NULL, 0, checkfolder, L"c:\test", 0, NULL);
}

void OnMyMessage()
{
    WIN32_FIND_DATA data;
    HANDLE handle = FindFirstFile(L"c:\test\file.txt", &data);
    if (handle != INVALID_HANDLE_VALUE)
    {
        FindClose(handle);
        if (CompareFileTime(&data.ftLastWriteTime, &SaveFileTime) != 0)
            OutputDebugStringA("file.txt was modified\n");
        else
            OutputDebugStringA("Another file in the same directory was modified\n");
    }
    else
    {
        OutputDebugStringA("file.txt was deleted, or directory was removed/renamed\n");
    }
}