检测文档目录下的文件更改

时间:2013-11-08 09:15:41

标签: ios objective-c itunes

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

使用Application Delegate中的以下函数进行调用 但不再是:

- (void)applicationDidBecomeActive:(UIApplication *)application

有替代解决方案吗?

3 个答案:

答案 0 :(得分:6)

有一个解决方案: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()开始监控。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果在监视文件夹中的任何文件发生更改,而不是检测何时从您想知道的文件夹中添加或删除文件,则问题仍然有效。我没有成功使用DISPATCH_VNODE_WRITE。

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

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