我想查看對檔案所做的更改(我正在等待的事件是更改內容事件,即最后修改日期已更新)
我有一個像這樣的代碼(實際代碼的最小化示例)我希望while回圈的每次迭代事件都會被重置并且可以再次被觸發但那不會發生
為什么它只觸發一次更改事件?
int main()
{
const wchar_t *dir_path = L"C:\\Users\\IC\\AppData\\Roaming\\JetBrains\\CLion2021.3\\scratches\\";
HANDLE hDir = ::CreateFileW(
dir_path,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL
);
FILE_NOTIFY_INFORMATION fni;
OVERLAPPED overlapped;
overlapped.hEvent = ::CreateEventA(NULL, FALSE, FALSE, NULL);
::ReadDirectoryChangesW(
hDir,
&fni,
sizeof(fni),
TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE,
NULL,
&overlapped,
NULL
);
while (true)
{
std::vector<HANDLE> all_job_event_handles;
if (::ResetEvent(overlapped.hEvent) == FALSE)
{
printf("ResetEvent failed\n");
fflush(stdout);
return 1;
}
all_job_event_handles.push_back(overlapped.hEvent);
DWORD result = ::WaitForMultipleObjects(all_job_event_handles.size(), all_job_event_handles.data(), FALSE, INFINITE);
if (result == WAIT_FAILED)
{
printf("WaitForMultipleObjects failed\n");
fflush(stdout);
return 1;
}
if (result >= WAIT_OBJECT_0 && result < WAIT_OBJECT_0 all_job_event_handles.size())
{
printf("file changed\n");
fflush(stdout);
}
}
}
uj5u.com熱心網友回復:
因為那不是如何ReadDirectoryChanges作業的。它不會不斷地向您發送更改。它會向您發送一批更改。你處理它們。您再次呼叫該函式以告訴系統您需要更多更改。
我在這里找到了該函式的正確用法示例:https ://gist.github.com/nickav/a57009d4fcc3b527ed0f5c9cf30618f8
一些旁注:
- 你不檢查是否
ReadDirectoryChanges成功。這是不好的; 如果失敗,您將永遠掛在等待呼叫上。 - 您不會對
OVERLAPPED結構進行零初始化。 - 您將事件創建為自動重置事件(第二個引數是
FALSE)。ResetEvent在這樣的事件上什么都不做。 - 您添加到向量中的所有事件句柄都是同一個事件物件。您只是有一個不斷增長的串列,其中包含您反復傳遞給的同一事件
WaitForMultipleObjects。這充其量什么都不做,但最終會失敗,因為WFMO不允許超過MAXIMUM_WAIT_OBJECTS句柄,而且這個數字相當低(我認為是 32)。 - 您可能希望在打開的目錄上使用更寬松的共享模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428290.html
上一篇:在ctypes中獲取當前桌面壁紙
