对于经常变化的文件,会采用定时器去读取文件,然后比较文件是否有变更;如果文件更新频率高而且定时器时间短,会占用大量机器资源。特别是当定时时间较短,文件本身更新频率远远小于定时器时间时。
采用操作系统提供的文件变化事件降低对资源的浪费。
#include <iostream>
#include <Windows.h>
int main() {
// 监控文件
LPCWSTR filePath = L"D:\\it\\windows\\file_modify_moniter\\file_modify_moniter\\1.txt";
HANDLE hFile;
while (1)
{
hFile = CreateFile(filePath,
FILE_READ_ATTRIBUTES | SYNCHRONIZE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open file: " << GetLastError() << std::endl;
Sleep(3000); // 休眠1秒
continue;
}
break;
}
std::cout << "Sucessed to open directory: " << "D:\\it\\windows\\file_modify_moniter\\file_modify_moniter\\1.txt" << std::endl;
HANDLE hDirectory;
while (1)
{
hDirectory = CreateFile(L"D:\\it\\windows\\file_modify_moniter\\file_modify_moniter",
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
if (hDirectory == INVALID_HANDLE_VALUE) {
std::cerr << "Failed to open directory: " << GetLastError() << std::endl;
CloseHandle(hFile);
Sleep(3000); // 休眠1秒
continue;
}
break;
}
std::cout << "Sucessed to open directory: " << "D:\\it\\windows\\file_modify_moniter\\file_modify_moniter" << std::endl;
BYTE buffer[4096];
DWORD bytesReturned;
while (true) {
if (!ReadDirectoryChangesW(hDirectory,
buffer,
sizeof(buffer),
FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
&bytesReturned,
NULL,
NULL)) {
std::cerr << "Error reading directory changes: " << GetLastError() << std::endl;
Sleep(3000); // 休眠1秒
continue;
}
std::cout << "Sucessed reading directory changes: " << "D:\\it\\windows\\file_modify_moniter\\file_modify_moniter" << std::endl;
PFILE_NOTIFY_INFORMATION pNotifyInfo = reinterpret_cast<PFILE_NOTIFY_INFORMATION>(buffer);
while (true) {
// 处理文件变化事件
// 根据pNotifyInfo指向的文件变化信息做相应处理
if (pNotifyInfo->Action == FILE_ACTION_MODIFIED && std::wstring(pNotifyInfo->FileName, pNotifyInfo->FileNameLength / sizeof(wchar_t)) == L"1.txt") {
std::cout << "File modified.\n";
// 处理文件修改事件的逻辑
}
if (pNotifyInfo->NextEntryOffset == 0)
break;
pNotifyInfo = reinterpret_cast<PFILE_NOTIFY_INFORMATION>(reinterpret_cast<BYTE*>(pNotifyInfo) + pNotifyInfo->NextEntryOffset);
}
}
CloseHandle(hDirectory);
CloseHandle(hFile);
return 0;
}