使用 C++ 监视文件更新
monitoring file update using c++
在 c++ 中使用 windows api 我如何监视文件更改事件
赞:"this_program.py" 正在更新文本文件。
outfile.open("some_file_1.txt",ios::out);
- 然后编辑 "some_file_1.txt"、
- "some_file_1.txt" 触发一些 window 事件,
- 我想监控和记录谁在更新 "some_file_1.txt"、
- 就像我从 "this_program.py" 更新一样....
所以我可以监控文件系统上的文件更改,使用 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");
}
}
在 c++ 中使用 windows api 我如何监视文件更改事件
赞:"this_program.py" 正在更新文本文件。
outfile.open("some_file_1.txt",ios::out);
- 然后编辑 "some_file_1.txt"、
- "some_file_1.txt" 触发一些 window 事件,
- 我想监控和记录谁在更新 "some_file_1.txt"、
- 就像我从 "this_program.py" 更新一样....
所以我可以监控文件系统上的文件更改,使用 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");
}
}