OSX中的事务性文件操作

时间:2012-08-02 17:34:02

标签: objective-c macos cocoa filesystems

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

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

现在我正在使用NSFileManager执行attributesOfItemAtPath:error:后跟removeItemAtPath:error:。我担心在两次使初始检查失效的操作之间会发生一些事情。

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

修改

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

修改2

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

而不是删除它

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

有一种方法可以用Cocoa锁定文件;几天前我用Google搜索并解决了这个问题,但我已经忘记了具体的消息;抱歉..

答案 2 :(得分:0)

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

fileManager:shouldRemoveItemAtPath:

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

希望这个帮助

答案 3 :(得分:0)

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