【发布时间】: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