【发布时间】:2013-11-08 09:15:40
【问题描述】:
我的应用开启了 iTunes 文件共享,当用户在 iTunes 中添加文件时,它应该能够检测到。
Application Delegate 中的以下函数用于调用 但不再是:
- (void)applicationDidBecomeActive:(UIApplication *)application
有其他解决方案吗?
【问题讨论】:
标签: ios objective-c itunes
我的应用开启了 iTunes 文件共享,当用户在 iTunes 中添加文件时,它应该能够检测到。
Application Delegate 中的以下函数用于调用 但不再是:
- (void)applicationDidBecomeActive:(UIApplication *)application
有其他解决方案吗?
【问题讨论】:
标签: ios objective-c itunes
有一个解决方案:GCD。 GCD 允许你创建一个dispatch_source_t 来监视 vnode 的变化,比如在目录中写入,然后通知你。基本是:使用open(path, O_EVTONLY) 系统调用获取目录的文件描述符,然后调用dispatch_source_create() 并传递DISPATCH_SOURCE_TYPE_VNODE 作为类型和DISPATCH_VNODE_WRITE 作为掩码。使用dispatch_source_set_event_handler 设置事件处理程序,并在将文件写入目录时执行您需要执行的任何操作,此外,您还需要设置一个调用close() 的取消处理程序以关闭文件描述符。最后拨打dispatch_resume()开始监控。
【讨论】:
您可以存储应用程序使用的最后一个文件的 MD5 哈希值。 每次启动应用程序时,都会从正在监视的文件中计算一个新的哈希值。 如果哈希值与您之前存储的不同,则文件已更改:
以下是计算文件 MD5 哈希的解决方案: Calculating MD5 Hash file
【讨论】:
如果您想知道受监视文件夹中的任何文件是否已更改,而不是检测何时从文件夹中添加或删除文件,则该问题仍然有效。我没有成功让它与 DISPATCH_VNODE_WRITE 一起使用。
是的,确实,当在文件夹中添加、删除或重命名文件时,我会收到一个 DISPATCH_VNODE_WRITE 事件(尽管这里也有问题 - 要找出这 3 个中的哪一个发生了,您必须拍摄快照文件夹的内容并比较它们 - 呸!)。但是,如果修改了文件夹中的现有文件,我不会收到 any 通知。我也尝试了 DISPATCH_VNODE_EXTEND 和 DISPATCH_VNODE_ATTRIB 没有成功。 这很糟糕,因为如果您有一个包含成百上千个文件的目录,您打算如何找出文件是否更改?
已弃用的 Carbon FSEvents 库比 GCD + 调度源方法 IMO 更加灵活和强大。
【讨论】: