如何确定在我的应用程序未运行时在给定目录中发生的更改?该目录仅包含目录和符号链接,但每当用户在目录中复制新文件或创建新子目录时,应用程序必须处理它。特别是如果在我的应用程序未运行时发生此更改。第一种天真的方法是将整个目录和文件列表存储在某个地方,并且在我的应用程序的下一次启动时,我再次抓取整个目录并将其与我保存的状态进行比较,但这需要很多时间。有没有办法为每个子目录创建一个哈希并只比较哈希?这会是更快的方法吗?你有这个任务的最佳实践吗?
亲切的问候
查看FSEvents文档。第 3 点描述您的问题和可能的解决方案:
FSEventStreamStart() -> 使用客户端在创建流时提供的回调开始接收事件并从客户端的 runloop(s) 为它们提供服务。如果为 sinceWhen 参数提供了值,则“历史”事件将首先通过您的回调发送,然后是 HistoryDone 事件,然后“当代”事件将持续发送(就像您为 sinceWhen 提供了 kFSEventStreamEventIdSinceNow 一样)。
如果您在创建时指定所需的目录,您将只会获得在该路径下或在该路径上发生的历史事件:
FSEventStreamRef FSEventStreamCreate(
CFAllocatorRef allocator,
FSEventStreamCallback callback,
FSEventStreamContext *context,
CFArrayRef pathsToWatch,
FSEventStreamEventId sinceWhen,
CFTimeInterval latency,
FSEventStreamCreateFlags flags);
您需要指定一个FSEventStreamCallback
. 此回调在该路径上发送路径数组和事件标志。然后,您应该能够筛选事件。看看FSEventStreamEventFlags
选择你需要的那些。
另请查看文件系统事件编程指南。有一个部分处理您的确切问题。那里的建议是将事件系统与层次缓存结合起来。