5

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

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

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

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

编辑

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

编辑 2

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

4

4 回答 4

0

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

于 2013-02-04T16:38:35.017 回答
0

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

于 2012-08-05T02:49:45.483 回答
0

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

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

于 2012-08-05T02:53:03.803 回答
0

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

fileManager:shouldRemoveItemAtPath:

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

希望这有帮助

于 2012-08-11T14:56:16.343 回答