【问题标题】:File.Move atomic operation [duplicate]File.Move 原子操作
【发布时间】:2013-03-08 00:30:41
【问题描述】:

我正在尝试使用 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.Move,这是否确保移动操作将是原子性的,还是有其他方法可以实现这种原子性?

【问题讨论】:

  • 你说的确切是什么意思:原子移动?
  • 你能更新两个应用程序逻辑吗?如果是 - 使用 Mutex 来同步访问
  • 我建议先检查是否存在并删除。你永远不知道,Filename_temp.txt 何时可能已经存在。
  • @Tigran,他希望文件在其他进程可见之前完成。

标签: c# file atomic


【解决方案1】:

根据MSDN博客文章How to do atomic writes in a file,重命名NTFS文件是一个原子操作:

解决方案?让我们记住元数据更改是原子的。重命名就是这样的情况。因此,我们可以只执行对临时文件的写入,并且在我们知道写入在磁盘上(完成并刷新)之后,我们可以将旧文件与新文件互换。

当然,这并不能保证 File.Move 只会发出 NTFS 重命名操作,但我想不出它应该做更复杂的事情的正当理由。

【讨论】:

  • 当然是有原因的:文件可以移动到不同的设备上。
【解决方案2】:

如果源和目标位于同一卷上,则 File.Move 应该是“重命名”。因此,无论文件大小如何,移动都应该是“即时的”。我想这是你的担心?

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

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

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

我想如果它是 100% 关键,您可以查看 Transactional NTFS。我不确定 .Net 中是否有包装器,因此您可能需要使用 P/Invoke。

【讨论】:

  • 没错,这是否记录在某处?
  • 目前找不到任何东西,它更多是 NTFS 的功能,而不是 .Net。将尝试查找参考资料。
  • +1。在这一点上,来自 Microsoft 的消息来源似乎相互矛盾。
【解决方案3】:

这是 windows 的一个特性,而不是 c# 或 .Net Framework。

看这里

Atomicity of File.Move

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 基本上是指示 DONE 的信号量文件,但是这需要改变观察过程,不幸的是这超出了我的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多