gpt4 book ai didi

c++ - 我应该如何读取 FILE_NOTIFY_INFORMATION 结构中的文件名

转载 作者:行者123 更新时间:2023-11-28 02:25:27 26 4
gpt4 key购买 nike

我正在尝试监视文件更改,但我不确定如何读取 FILE_NOTIFY_INFORMATION 结构中的文件名:

    HANDLE dwChangeHandles[2];
DWORD dwWaitStatus;
wChangeHandles[0] = FindFirstChangeNotification(dirname.c_str(), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) printerr(__FILE__,__LINE__,"FindFirstChangeNotification function failed.\n");
...
if ((dwChangeHandles[0] == NULL) || (dwChangeHandles[1] == NULL)) //final validation
printerr(__FILE__,__LINE__,"Unexpected NULL from FindFirstChangeNotification.\n");

while (TRUE) {
std::cout << "Waiting for notification...\n";
dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE);
if(dwWaitStatus==WAIT_OBJECT_0){
std::cout << "Something changed\n";

DWORD BytesReturned;
size_t bufLen = 1024;
FILE_NOTIFY_INFORMATION buffer[bufLen];
if (ReadDirectoryChangesW(dwChangeHandles[0], buffer, bufLen, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &BytesReturned, NULL, NULL)){
std::wcout << std::wstring(buffer->FileName)<< std::endl; //THERE IS NOTHING IN THE EXPECTED OUTPUT HERE
}
if (FindNextChangeNotification(dwChangeHandles[0]) == FALSE ) printerr(__FILE__,__LINE__,"FindNextChangeNotification function failed.\n");
}

else if(dwWaitStatus==WAIT_TIMEOUT) printerr(__FILE__,__LINE__,"No changes in the timeout period.\n");
else printerr(__FILE__,__LINE__,"Unhandled dwWaitStatus.\n");
}

我做错了什么

最佳答案

你有很多我可以立即看到的问题:

  1. 根据 ReadDirectoryChangesW 的文档函数,缓冲区需要 DWORD 对齐。由于您在堆栈上使用缓冲区,因此无法保证这一点 - 您应该改为从堆中分配一个缓冲区。

  2. 您似乎没有正确使用该功能。通常您会先调用 ReadDirectoryChangesW,然后然后等待该事件。不是相反。当 ReadDirectoryChangesW 返回异步调用时,此时缓冲区中通常没有数据。在使用缓冲区内容之前,您需要等待请求已完成的通知。

  3. FindNextChangeNotification 仅与 FindFirstChangeNotification 一起使用,所以这是完全错误的。 ReadDirectoryChangesW 完成后,您需要使用 FILE_NOTIFY_INFORMATION 中的 NextEntryOffset 字段循环返回事件的结构。

编辑:由于您向问题添加了更多代码,现在很明显您正在混合使用这两个 API。 FindFirstChangeNotificationFindNextChangeNotification 是一个 API,而 ReadDirectoryChangesW 是另一个。我相信您对文档中的这段话感到困惑:

This function does not indicate the change that satisfied the wait condition. To retrieve information about the specific change as part of the notification, use the ReadDirectoryChangesW function.

我想你的困惑是可以理解的,但是这两个 API 不能一起使用。如果您正在使用 FindFirstChangeNotification,那么您得到的只是一个通知,告诉您某事 已更改,您必须重新读取目录以找出它是什么。如果您需要文件级别的特定通知,则必须使用 ReadDirectoryChangesW 进行监控。

关于c++ - 我应该如何读取 FILE_NOTIFY_INFORMATION 结构中的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30837120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com