FSEvents处理由其他操作系统更改的磁盘

我在FSEvents上看到奇怪的行为,我在恢复模式下挂载我的驱动器,并在重新启动时在我的流中获得零个fsevents。 我做了以下几点:

  • 定期开机
  • 用FSEventsGetCurrentEventId()记录当前事件
  • 在恢复模式下启动并修改观看路径中的文件
  • 重新启动系统
  • 发生这种情况时,我使用fsevents API时根本没有收到任何事件。 它在kFSEventStreamEventFlagHistoryDone sentinel中发送的唯一标志,即使我在常规操作系统上做了其他更改。

    这ars技术审查似乎暗示,当你在其他设备上挂载时,你应该得到kFSEventStreamEventFlagMustScanSubDirs标志,但我没有看到这种行为。 有没有人遇到过这个? 有没有更好的方法来检测和处理在操作系统关闭的情况下驱动器已安装在别处的情况?

    更新:我尝试了从linux启动和修改文件系统的相同的东西。 无论如何,我没有得到0事件的奇怪行为,但我也没有从我更改的目录或MustScanSubdirs标志中获得事件。

    更新2:在此线程中,接受的响应表示当发生这种情况时,时间机器会在上述情况下检测到日志已过期。 任何人都知道如何检测日志是否过期? 这个日期可以用来代替一个标志。


    我想你还需要在步骤#2中存储FSEvents数据库的UUID,并在步骤#4中检查它。

    在Apple的文档中隐含地提到了这种行为(强调添加):

    注意:因为可以通过运行早期版本的OS X的计算机(或潜在的其他操作系统)来修改磁盘,所以应该将事件列表视为建议,而不是卷的所有更改的明确列表。 如果磁盘被运行OS X以前版本的计算机修改,则历史日志将被丢弃。

    例如,备份软件应该定期执行任何卷的全面扫描,以确保没有更改通过裂缝落下。

    注意关于历史日志丢弃的位,然后查看引用(添加了重点):

    FSEventStreamGetLatestEventId() - >最初,这会返回流创建时提供的sinceWhen值; 此后,它将在调用客户端回调之前用当前批次事件中提到的编号最大的事件ID进行更新。 只要客户端还存储设备的UUID (通过FSEventsCopyUUIDForDevice()获取), 客户端就可以持久存储此值 。 客户可以稍后将此事件ID作为sinceWhen参数提供给FSEventStreamCreateRelativeToDevice(),只要其UUID与您存储的内容匹配即可。 这是可行的,因为FSEvents服务将事件存储在持久的每卷数据库中。 在这方面,事件ID流就像一个全局的系统时钟,但与任何特定的时基没有关系。

    FSEventsCopyUUIDForDevice() - >获取唯一标识该卷的FSEvents数据库的UUID。 如果数据库被丢弃,那么它的替换将具有不同的UUID,以便客户端能够检测到这种情况并避免尝试使用它们作为sinceWhen参数存储到FSEventStreamCreate ...()函数中的事件ID。

    请注意,UUID是每个设备的,因此如果您的目录树中装有任何文件系统,则可能需要获取它们中的每一个的UUID。

    祝你好运!

    链接地址: http://www.djcxy.com/p/25369.html

    上一篇: FSEvents treatment of disk changed by other OS

    下一篇: Watch directory for file changes