我一直在玩FSEvents
在我的一个小应用程序中,将我的应用程序的内容与硬盘驱动器上的内容同步(基本上,它是一个小图像查看器,我希望它的内容在硬盘驱动器内容更改时更新)
我使用创建我的流kFSEventStreamCreateFlagFileEvents
标志,但我很难弄清楚操作系统(或内核,或其他什么)如何生成这些事件,不幸的是,没有关于使用此标志生成的事件的文档...似乎它们是 10.7 的新功能,并且仍然没有记录。
所以,我的主要问题是“重命名”。当我进行简单的重命名时,2 个 kFSEventStreamEventFlagItemRenamed 事件将发送到我的回调。第一个包含旧文件名,第二个包含新文件名。当您重命名一批文件时会出现问题,这些事件可能不是连续的。例如,有以下情况:
- “文件1”->“新文件_1”
- “文件2”->“新文件_2”
我可能会按以下顺序收到事件:
- “重命名”/“文件1”
- “重命名”/“文件2”
- “重命名”/“new_file_1”
- “重命名”/“new_file_2”
当你捕获第二个重命名事件时,似乎没有任何方法可以获取第一个重命名事件的 id ...所以我所做的是:当接收到“重命名”事件时,我使用 stat() 执行文件名。如果stat成功返回,则意味着它是新的文件名。如果没有,就说明是旧的了。我仍然无法链接这两个事件,但至少我可以通过删除旧文件并添加新文件来解决问题。
所以,我基本上有两个问题:
第一个是:我是否完全盲目,没有看到通过 fsevents 正确捕获“重命名”事件的明显方法?
第二个我:我有时会遇到一个奇怪的错误,不是只发送 2 个重命名事件,而是发送 3 个!所以我得到了一个文件添加了两次...我不确定这是否是一个错误,或者这是否来自于我完全错误地使用 fsevent API 和kFSEventStreamCreateFlagFileEvents
旗帜 ...
欢迎任何帮助,我完全没有办法解决这个问题!
您需要使用该标志kFSEventStreamCreateFlagUseExtendedData
(自 OS X 10.13 起可用)。使用该标志创建的流将包括inode事件文件的。这样您就可以检测在报告的事件批次中发生的“重命名链”。
附: macOS 可能会为新创建的文件重用已删除文件的索引节点,但如果您立即处理事件,则风险可以忽略不计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)