如何确定目录中的更改及其在应用程序运行之间的子目录?

时间:2012-11-14 14:26:47

标签: cocoa hash

如何在我的应用程序未运行时确定给定目录中发生的更改? 该目录仅包含目录和符号链接,但只要用户在目录中复制新文件或创建新的子目录,应用程序就必须处理它。特别是如果我的应用程序没有运行时发生这种变化。 第一种naiv方式是将整个Directory和Fileslist存储在某处,然后在我的应用程序的下一次启动时,我再次抓取整个目录并将其与我保存的状态进行比较,但这需要花费很多时间。有没有办法为每个子目录创建一个哈希并只比较哈希?这会更快吗?你有这个任务的最佳实践吗?

亲切的问候

1 个答案:

答案 0 :(得分:1)

查看FSEvents文档。第3点描述了您的问题和可能的解决方案:

  

FSEventStreamStart() - >在创建流时,使用客户端提供的回调开始接收事件并从客户端的runloop服务它们。如果为since参数提供了值,那么“历史”事件将首先通过回调发送,然后是历史记录事件,那么“当代”事件将持续发送(就好像你已经提供了kFSEventStreamEventIdSinceNow)。

如果您在创建时指定了所需的目录,则只能获得在该路径下或在该路径下发生的历史事件:

FSEventStreamRef FSEventStreamCreate(
   CFAllocatorRef allocator,
   FSEventStreamCallback callback,
   FSEventStreamContext *context,
   CFArrayRef pathsToWatch,
   FSEventStreamEventId sinceWhen,
   CFTimeInterval latency,
   FSEventStreamCreateFlags flags);

您需要指定FSEventStreamCallback。此回调在该路径上发送路径和事件标志的数组。然后你应该能够筛选事件。看一下FSEventStreamEventFlags来挑选你需要的那些。

另请查看File System Events Programming guide。有一节介绍了您的确切问题。建议将事件系统与层次缓存结合起来。