为什么在监视目录中创建子目录时未正确触发ReadDirectoryChangesW?

时间:2018-04-04 17:53:36

标签: c++ windows readdirectorychangesw

(更简单的代码更新)

我正在使用ReadDirectoryChangesW()来监视某些文件夹的更改。当在其中一个监视文件夹中创建文件时,它可以正常工作,但是当创建子目录时,它永远不会得到通知。

例如,如果我观察路径c:\ testA \ testB并在该文件夹中创建文件,则ReadDirectoryChangesW()可以正常工作。如果我在该文件夹中创建目录,则WaitForSingleObjectEx不会返回。

有趣的是,如果我改为观察c:\ testA并在c:\ testA \ testB下创建一个目录,那么WaitForSingleObjectEx将按预期返回。请注意,我不是在观看子文件夹,(bWatchSubtree == false)所以这个结果很奇怪。

一种可能的解决方案是为我要监控的每个文件夹查看两个文件夹,文件更改的文件夹本身以及任何子目录更改的父文件夹,但您可以看到为什么这很乏味。

以下是一些重现问题的示例代码:

const byPropKey = (propertyName, value) => () => ({
    [propertyName]: value,
});

在c:\ testA \ testB \ newfile.txt运行此代码并生成新的文件会产生此输出:

<input
    value={username}
    onChange={event => this.setState(byPropKey('username', event.target.value))}
    type="text"
    placeholder="Full Name"
/>

在c:\ testA \ testB \ newdir上运行此代码并创建一个新的目录永远不会被唤醒。

为什么创建目录会导致两个文件夹的通知?为什么不只是父母?为什么创建文件和创建文件夹的行为完全不同?

0 个答案:

没有答案