我使用下一段代码来了解某个文件夹中的文件何时发生了更改:
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会阻止线程,直到文件发生更改。有什么方法可以停止/强制从这个函数返回吗?
发布于 2012-01-12 17:38:05
从你的描述来看,听起来CancelIoEx应该能做到这一点。显然,您需要另一个线程来完成此任务,因为您现在正在同步调用它。这会阻塞调用线程,因此您无法从该线程执行任何操作,甚至不能停止。
发布于 2012-01-12 02:34:09
我认为你需要看看这篇博文:http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
这是一篇很长的文章,但内容非常丰富,它讨论了与这种方法相关的所有问题。
发布于 2012-01-12 03:18:33
您需要在异步操作模式下调用此API函数。与许多其他文件API一样,您可以通过将OVERLAPPED结构传递给API调用来实现这一点。
当您异步操作时,函数将立即返回,当您选择收集结果时,这取决于您。您可以测试函数是否准备好提供结果,可以选择通知API有可用的结果,可以取消挂起的I/O,还可以选择阻塞,直到结果可用。它有非常大的灵活性,在异步模式下使用API自然会更加复杂。
在MSDN上有很多关于重叠I/O的信息。从这里开始:Synchronization and Overlapped Input and Output。
https://stackoverflow.com/questions/8824473
复制相似问题