在Linux上工作的原子重命名有一种方法可以在Windows和Linux上模拟它。 OSX?

时间:2011-05-10 00:19:50

标签: filesystems locking atomic

在linux下,您可以使用覆盖重命名文件。例如,重命名-f file_a file_b 将用file_a覆盖file_b,它将是原子的。

在OS / X下,似乎这应该有效,但它有问题。 在Windows下,不。 在网络文件系统上 - 可能不是。

有没有办法在合作进程中模拟这种行为?

例如,如果我只在一个进程中需要这个,那么可以创建一个原子重命名函数来创建一个互斥锁,删除文件然后重命名文件并解锁。这应该可以在所有平台上运行。

然而,在整个过程中,它有点棘手。我可以做一个机器范围的互斥锁,但这不会解决它在不同机器上的协作进程。

我能用锁文件模拟这个吗?如果是这样,我该如何可靠地做到这一点,如果一个进程过早结束它可以清理,或者我可以识别一个不再有效的锁定文件并将其删除?

2 个答案:

答案 0 :(得分:2)

编辑:不推荐使用NTFS文件系统事务支持。出于历史原因留下这个答案,但替代方案在这里:http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx

NFTS支持FS上的交易。因此,您无法完全按照自己的意愿行事,但您可以启动事务,删除文件然后重命名。 http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

我应该指出这需要Vista或更高版本。

答案 1 :(得分:0)

传递窗口,但是如果目标和源共享相同的文件系统,则mv -f在BSD(可能是OSX)上进行原子重命名。我认为这个限制适用于linux以及重命名操作意味着inode被移动到不同的目录,并且inode是每个filesytem唯一的。我不确定你在这里要阻止什么:两个进程重命名相同,即源和目的地相同?