【发布时间】:2010-09-15 02:36:59
【问题描述】:
在 POSIX 系统上,rename(2) 提供原子重命名操作,包括在目标文件存在且权限允许的情况下覆盖目标文件。
有没有办法在 Windows 上获得相同的语义?我知道 Vista 和 Server 2008 上的 MoveFileTransacted(),但我需要它来支持 Win2k 及更高版本。
这里的关键词是原子...解决方案不能以任何方式失败,导致操作处于不一致状态。
我看到很多人说这在win32上是不可能的,但我问你,真的吗?
如果可能,请提供可靠的引用。
【问题讨论】:
-
@Adam Davis - 如果您可以控制阅读器程序以及编写器,则可以这样解决。阅读器执行 io.Directory("FileDone_*.dat") 并选择最高的 # 代替 *。 Write 创建名为“FileWriting.dat”的文件并将其重命名为“FileDone_002.dat”..003、004 等。这不仅解决了非原子删除/重命名的问题,而且单个重命名是原子的,并且,如果旧文件保持打开状态,仍然可以更新。如果不是每次操作都重新打开,则阅读器可以基于计时器监视新文件。读者可以清理旧文件。