问题 监视文件更改的目录


我希望在更改文件时监视目录(数千个文件,大约有5个子目录级别)。我知道我可以使用FSEvents API监视目录,以便在该目录中更改文件,但我似乎无法弄清楚如何确定哪些文件发生了变化。 这个 参考建议我构建一个二叉树并在每次触发事件时遍历树,就是那个 最好 确定哪些文件被更改的方法?如果不是,那是什么 更好 备择方案?

是否更好地递归扫描目录并将kqueue附加到每个文件?我不确定这对成千上万的文件有多好?


4675
2018-06-26 20:43


起源



答案:


我用过 UKKQueue 在混合结果之前。

我最近意识到一个更好的解决方案,但我没有尝试过。如果您只需要针对Lion,我认为这样做的最佳实践方法是使用 NSFileCoordinator。你实现的方法 NSFilePresenter 指出你感兴趣的目录( presentedItemURL 当子项移动/更改/被删除时,系统将通知您(通过类似方法) presentedSubitemDidChangeAtURL:

如果你走那条路,我很想知道这是怎么回事。


8
2018-06-27 00:32



Jesse,您是否尝试过使用NSFileCoordinator / NSFilePresenter来实现对某些文件夹的监控?我无法使这个解决方案工作 - 它根本不会通知我任何事件。 - Daniel O'Hara
@DaveNewman NSFileCoordinator只有在进行更改的程序也在使用它时才有效。 (即它是一个选择加入的API)大多数可可程序都会这样做;您可能会看到由较低级别的API所做的更改吗? - Jesse Rusak
我不明白。例如,我为我的文件夹创建了一个文件展示器,比如'/ Users / Dave / MyFolder'。现在,当我将文件放入此目录(拖放)时,仅限 presentedSubitemDidChangeAtURL: 方法是由系统调用的,但不是 presentedSubitemDidAppearAtURL:。它也没有打电话 accommodatePresentedSubitemDeletionAtURL 当我在Finder中删除一些文件时。我错过了什么吗? - Daniel O'Hara
@DaveNewman我不确定。但至少你会得到回调。也许你可以通过一些关于如何设置监控的更多细节来开始一个关于它的新问题,看看是否有人知道发生了什么。 - Jesse Rusak
@DaveNewman我正面对 完全相同的问题 - Konstantin Pavlikhin


答案:


我用过 UKKQueue 在混合结果之前。

我最近意识到一个更好的解决方案,但我没有尝试过。如果您只需要针对Lion,我认为这样做的最佳实践方法是使用 NSFileCoordinator。你实现的方法 NSFilePresenter 指出你感兴趣的目录( presentedItemURL 当子项移动/更改/被删除时,系统将通知您(通过类似方法) presentedSubitemDidChangeAtURL:

如果你走那条路,我很想知道这是怎么回事。


8
2018-06-27 00:32



Jesse,您是否尝试过使用NSFileCoordinator / NSFilePresenter来实现对某些文件夹的监控?我无法使这个解决方案工作 - 它根本不会通知我任何事件。 - Daniel O'Hara
@DaveNewman NSFileCoordinator只有在进行更改的程序也在使用它时才有效。 (即它是一个选择加入的API)大多数可可程序都会这样做;您可能会看到由较低级别的API所做的更改吗? - Jesse Rusak
我不明白。例如,我为我的文件夹创建了一个文件展示器,比如'/ Users / Dave / MyFolder'。现在,当我将文件放入此目录(拖放)时,仅限 presentedSubitemDidChangeAtURL: 方法是由系统调用的,但不是 presentedSubitemDidAppearAtURL:。它也没有打电话 accommodatePresentedSubitemDeletionAtURL 当我在Finder中删除一些文件时。我错过了什么吗? - Daniel O'Hara
@DaveNewman我不确定。但至少你会得到回调。也许你可以通过一些关于如何设置监控的更多细节来开始一个关于它的新问题,看看是否有人知道发生了什么。 - Jesse Rusak
@DaveNewman我正面对 完全相同的问题 - Konstantin Pavlikhin


如果您使用创建流 kFSEventStreamCreateFlagFileEvents 然后,您将获得每个文件更改的事件,而不仅仅是对已监视目录的更改的通知。不幸的是,这仅适用于OSX 10.7及更高版本。


6
2017-12-06 03:22