【问题标题】:Transactional File Operations in OSXOSX 中的事务文件操作
【发布时间】:2012-08-02 17:34:02
【问题描述】:

我正在尝试执行以下操作:

  • 读取文件的属性
  • 如果属性匹配某个条件, 删除文件

现在我使用NSFileManager 来执行attributesOfItemAtPath:error:,然后是removeItemAtPath:error:。我担心这两个操作之间会发生一些使初始检查无效的事情。

使这两个操作原子化的最佳方法是什么?

编辑

到目前为止的答案建议文件锁定,我已经尝试过调查。我能找到的最接近的事情是设置NSFileImmutable 标志。但似乎任何其他程序都可以出现,取消设置并修改文件。有没有更好的方法来锁定文件?

编辑 2

有人要求一个用例。假设我正在尝试使两个文件夹保持同步。对一个文件夹中的文件所做的任何更改都会镜像到另一个文件夹中,反之亦然。如果我从文件夹 A 中删除文件 1,我也会从文件夹 B 中删除文件 1。但是如果文件夹 B 中的文件 1 在我删除之前发生更改;然后我不想删除它,而是想将它同步回文件夹 A

【问题讨论】:

  • 您检查哪些属性?
  • NSFileModificationDate 就是一个例子
  • 您的设想是阅读和表演之间的时间很短,还是很长?我的意思是,您是在找到与谓词匹配的文件并立即对其执行操作,还是您是在找到与谓词匹配的所有文件然后对所有文件执行操作?
  • @RobNapier 很短的一段时间。我立即采取行动。
  • 一种可能的方法: 1) 打开文件并获得锁以防止修改。 2) 检查您感兴趣的属性。 3) 在文件被锁定时删除文件。根据unlink 的手册页,这将删除文件名,但只有在关闭所有对它的引用时才会删除该文件。 4)关闭文件,释放锁并导致它被删除。我现在不在我的电脑前测试这个,但我看不出它为什么不能工作。

标签: objective-c macos cocoa filesystems


【解决方案1】:

您可以使用强制(内核强制)文件锁定来锁定有问题的文件,以防止在您对文件进行操作时对其进行更改。我知道 Linux 和 Solaris 支持强制文件锁定,但我不知道 OS X / HFS+ 是否支持以及如何使用它。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    那么你有不止一个属性查询吗?如果是这样,为什么不在开始查询之前锁定文件?完成后,解锁。然后如果删除,删除。

    有一种方法可以用 Cocoa 锁定文件;几天前我在谷歌上搜索并解决了这个问题,但我已经忘记了具体的信息;对不起..

    【讨论】:

      【解决方案3】:

      我建议使用消息来接受或删除此方法的文件:

      fileManager:shouldRemoveItemAtPath:
      

      您开发的原型是调用方法删除文件,并在方法shouldRemoveItemAtPath:您接受(返回YES)或拒绝(返回NO)作为文件属性值。

      希望有帮助

      【讨论】:

        【解决方案4】:

        在我看来,您应该继续删除匹配的文件。除非您担心其他应用程序会更改文件以使其无法删除,否则锁定是没有意义的。想想看;您找到了符合您的删除条件的文件。你想删除它。在此期间是否发生变化真的很重要吗?

        【讨论】:

        • 是的,这很重要。假设我正在尝试使两个文件夹保持同步。对一个文件夹中的文件所做的任何更改都会镜像到另一个文件夹中,反之亦然。如果我从文件夹 A 中删除文件 1,我也会从文件夹 B 中删除文件 1。但是如果文件夹 B 中的文件 1 在我删除之前发生更改;然后我不想删除它,而是想将它同步回文件夹 A。
        • 看,你没有提到那部分。
        • 我可以将它添加到描述中,但是无论有没有这些信息,问题都是一样的。我问的是“我该怎么做 x?”,而不是“x 是正确的做法吗?”
        • 我明白这是一个假设。即使在给定的用例中,锁定也是不必要的。如果您锁定该文件,您就知道在删除它之前它不会改变。那么,如果它真的发生了变化,那又有什么关系呢?锁定是不必要的复杂性。无论如何,如何回答。我只是想指出,也许您正在寻找错误问题的解决方案。
        • 不确定我是否理解这一点:“如果您锁定文件,您在删除它之前就知道它不会改变。那么,如果它真的改变了又有什么关系呢?”锁定文件将解决问题。但是,我还没有找到 OS X 提供的文件锁定 API。
        猜你喜欢
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多