原子重命名,适用于Linux,有没有办法在Windows和OSX上模拟它?



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

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

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

例如,如果我只需要在单个进程中使用它,则可以创建一个原子重命名函数,该函数创建互斥锁,执行删除文件,然后重命名文件并解锁。 这应该能够在所有平台上工作。

但是,在整个过程中,这有点棘手。 我可以做一个机器范围的互斥锁,但这并不能解决不同机器上的协作进程的问题。

我可以用锁定文件模拟吗? 如果是这样,我该如何可靠地执行此操作,以便在进程提前结束时它可以清理,或者我可以识别不再有效的锁定文件并将其删除?

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新