如何从其他线程停止ReadDirectoryChangesW

时间:2012-01-11 18:14:26

标签: c++ winapi filesystems

我使用下一个代码来了解某个文件夹中文件的更改时间:

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阻塞线程,直到发生文件更改。有没有办法停止/强制从这个功能返回?

5 个答案:

答案 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()。