在linux下,您可以使用覆盖重命名文件。例如,重命名-f file_a file_b 将用file_a覆盖file_b,它将是原子的。
在OS / X下,似乎这应该有效,但它有问题。 在Windows下,不。 在网络文件系统上 - 可能不是。
有没有办法在合作进程中模拟这种行为?
例如,如果我只在一个进程中需要这个,那么可以创建一个原子重命名函数来创建一个互斥锁,删除文件然后重命名文件并解锁。这应该可以在所有平台上运行。
然而,在整个过程中,它有点棘手。我可以做一个机器范围的互斥锁,但这不会解决它在不同机器上的协作进程。
我能用锁文件模拟这个吗?如果是这样,我该如何可靠地做到这一点,如果一个进程过早结束它可以清理,或者我可以识别一个不再有效的锁定文件并将其删除?
答案 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唯一的。我不确定你在这里要阻止什么:两个进程重命名相同,即源和目的地相同?