文件.移动原子操作

本文关键字:原子操作 移动 文件 | 更新日期: 2023-09-27 18:02:51

我正在尝试使用c#生成一个巨大的文本文件,另一个进程正在不断地查看该位置,并试图在可用的情况下拾取该文件。

为了使文件原子化,下面是步骤:

1 - Write to file : Filename_temp.txt
2 - Check if Filename.txt already exists then Delete
3 - Do a File.Move to the same destination     
    From filename : Filename_temp.txt 
    TO : Filename.txt

由于c#没有重命名,我不得不依赖File。移动,这能确保移动操作是原子性的吗还是有其他方法来实现原子性?

文件.移动原子操作

根据MSDN博客文章如何在文件中进行原子写入,重命名NTFS文件是一个原子操作:

解决方案吗?让我们记住,元数据更改是原子性的。Rename就是这样一个例子。因此,我们可以只对一个临时文件执行写操作,当我们知道写操作已经在磁盘上(完成并刷新)之后,我们就可以用新文件交换旧文件。

当然,这并不能保证File.Move只是发出一个NTFS重命名操作,但是我想不出一个合理的理由为什么它应该做任何更复杂的事情。

文件。如果源和目标在同一卷上,Move应该是"rename"。所以,无论文件大小如何,移动都应该是"即时的"。我想这就是你关心的吧?

来自微软员工在http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspx上的常见问题解答,我们有;

常见问题:如果现有文件和新文件都在同一驱动器上,MoveFileEx是原子的吗?

简单的回答是"通常,但在某些情况下,它会无声地退回到非原子方法,所以不要指望它"。

我想如果它是100%关键的,你可以看看事务性NTFS。我不确定。net中是否有包装器,所以您可能需要使用P/Invoke.

这是windows的特性,而不是c#或。net框架。

看到

文件原子性。将

您可以直接将文件写入目标,并使用在您的大文件准备好后创建的零大小信号文件。您的读取器进程可以查找一个信号文件,并在信号文件可用后读取一个大文件。我认为这可以解决"原子性"问题。