【问题标题】:Detect file change under document directory检测文档目录下的文件更改
【发布时间】:2013-11-08 09:15:40
【问题描述】:

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

Application Delegate 中的以下函数用于调用 但不再是:

- (void)applicationDidBecomeActive:(UIApplication *)application

有其他解决方案吗?

【问题讨论】:

    标签: ios objective-c itunes


    【解决方案1】:

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

    【讨论】:

    • 我喜欢你的方法!我不知道这个
    • @ThomasKeuleers 它已成为我观看文件的首选方法,因为我不得不将一些 fsevents 代码移植到 iOS。总体而言,调度源非常棒且功能强大,并且非常不受欢迎(无论如何,就像调度组一样,在我看来)
    • 我最近使用了这个 gcd 功能,它封装在一个组合 publisher 中。
    【解决方案2】:

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

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

    【讨论】:

    • 那么如果更改了,您如何收到通知?您不妨只使用文件的修改时间和大小来检测更改。但这不是 OP 想知道的。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 2014-08-11
      • 2014-11-30
      • 1970-01-01
      • 2018-08-10
      • 2019-08-10
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多