4

我的应用程序打开了 iTunes 文件共享,当用户在 iTunes 中添加文件时,它应该能够检测到。

Application Delegate 中的以下函数曾经被调用,但不再被调用:

- (void)applicationDidBecomeActive:(UIApplication *)application

有替代解决方案吗?

4

3 回答 3

7

有一个解决方案:GCD。GCD 允许您创建一个dispatch_source_t监视 vnode 更改的方法,例如在目录中写入,然后通知您。基本是:使用open(path, O_EVTONLY)系统调用获取目录的文件描述符,然后调用并作为类型和掩码dispatch_source_create()传递。使用设置事件处理程序并在将文件写入目录时执行您需要执行的任何操作,此外,您还希望设置一个调用以关闭文件描述符的取消处理程序。最后,调用开始监控。DISPATCH_SOURCE_TYPE_VNODEDISPATCH_VNODE_WRITEdispatch_source_set_event_handlerclose()dispatch_resume()

于 2013-11-08T09:27:05.493 回答
0

您可以存储应用程序使用的最后一个文件的 MD5 哈希值。每次启动应用程序时,都会从正在监视的文件中计算一个新的哈希值。如果哈希值与您之前存储的不同,则文件已更改:

这是计算文件 MD5 哈希的解决方案: 计算 MD5 哈希文件

于 2013-11-08T09:20:47.830 回答
0

如果不是检测何时从文件夹中添加或删除文件,而是想知道受监视文件夹中的任何文件是否已更改,则该问题仍然有效。我没有成功让它与 DISPATCH_VNODE_WRITE 一起工作。

是的,当在文件夹中添加、删除或重命名文件时,我确实收到了 DISPATCH_VNODE_WRITE 事件(尽管这里也有问题 - 要找出这 3 个中的哪一个发生了,您必须拍摄文件夹内容的快照并比较它们 - 糟糕!)。但是,如果修改了文件夹中的现有文件,我不会收到任何通知。我也尝试了 DISPATCH_VNODE_EXTEND 和 DISPATCH_VNODE_ATTRIB 没有成功。这很糟糕,因为如果您有一个包含数百或数千个文件的目录,那么您如何确定文件是否更改?

已弃用的 Carbon FSEvents库比 GCD + 调度源方法 IMO 更加灵活和强大。

于 2016-05-19T20:27:32.030 回答