我使用下一个代码来了解某个文件夹中文件的更改时间:
HANDLE hDir = ::CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);
FILE_NOTIFY_INFORMATION returnData[1024];
DWORD returnDataSize = 0;
while(ReadDirectoryChangesW(hDir, returnData, sizeof(returnData), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE, &returnDataSize, NULL, NULL))
{
...
}
ReadDirectoryChangesW阻塞线程,直到发生文件更改。有没有办法停止/强制从这个功能返回?
答案 0 :(得分:6)
从您的描述中,听起来CancelIoEx
应该可以解决问题。显然,你需要另一个线程,因为你现在正在同步调用它。这会阻塞调用线程,因此您无法从该线程执行任何操作,甚至不会停止。
答案 1 :(得分:1)
我认为你需要看一下这篇博文:http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
这是一篇冗长的帖子,但它内容非常丰富,并且讨论了与此方法相关的所有问题。
答案 2 :(得分:1)
您需要以异步操作模式调用此API函数。与许多其他文件API一样,您可以通过将OVERLAPPED
结构传递给API调用来实现此目的。
当您异步操作时,该功能将立即返回,当您选择收集结果时,由您决定。您可以测试该功能是否准备好提供结果,您可以选择通知API有结果,您可以取消挂起的I / O,并且可以选择阻止,直到结果可用。有很多灵活性,自然API在异步模式下使用起来更复杂。
MSDN上有很多关于重叠I / O的信息。从这里开始:Synchronization and Overlapped Input and Output。
答案 3 :(得分:0)
如果您希望阻塞调用从另一个线程返回,请更改将使调用返回的内容 - 也许创建一个临时文件。
答案 4 :(得分:-1)
您可以在JNotify windows implementation中看到我是如何阻止它的。 看~Win32FSHook()。