【问题标题】:monitoring file update using c++使用 C++ 监控文件更新
【发布时间】:2015-08-26 16:14:33
【问题描述】:

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

like:“this_program.py”正在更新一个文本文件。

outfile.open("some_file_1.txt",ios::out);
  • 然后编辑“some_file_1.txt”,
  • “some_file_1.txt”触发一些窗口事件,
  • 我想监控和记录谁在更新“some_file_1.txt”,
  • 就像我正在从“this_program.py”等更新......

所以我可以使用 c++ 中的 winapi 或 mfc 监控文件系统上的文件更改,或者 蟒蛇。

监控什么事件,比如如何设置获取源文件的钩子。

outfile.close();

【问题讨论】:

    标签: python c++ winapi mfc


    【解决方案1】:

    对此没有特定的 MFC 选项(据我所知)。您可以使用FindFirstChangeNotification 监控整个文件夹的更改。如果检测到更改,则您的文件可能已更改(或者可能是另一个已更改的文件)。阅读文件上的日期/时间戳以查看是否发生了更改。另一个功能是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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-03
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多