File.Move() 会删除 IoException 上的原始内容吗?



我有一个网络服务,它正在写入由其他程序读取的文件。

为了防止阅读器程序在它们完成写入之前读取它们,我使用.tmp扩展名编写它们,然后使用 File.Move 将它们重命名为.xml扩展名。

我的问题是当我们以批量运行时 - 在短短几分钟内处理数千个文件。

我已经成功编写了文件"12345.tmp",但是当我尝试重命名它时,File.Move()抛出了一个IOException

File.Move("12345.tmp", "12345.xml")

异常:进程无法访问该文件,因为它正在使用 通过另一个过程。

对于我的情况,我并不真正关心文件名是什么,所以我重试:

File.Move("12345.tmp", "12346.xml")
异常:

异常:找不到文件"12345.tmp"。

如果重命名源文件时遇到错误,File.Move()是否正在删除源文件?

为什么?

有没有办法确保文件成功重命名或保持不变?

答案是,这在很大程度上取决于文件系统本身的实现方式。此外,如果 Move(( 位于两个文件系统之间(如果路径是网络共享,甚至可能在两台机器之间( - 那么它也在很大程度上取决于 Move(( 的 O/S 实现。因此,保证较少取决于System.IO.File的功能,而更多地取决于底层机制:操作系统代码,文件系统驱动程序,文件系统结构等。

通常,在绝大多数情况下,Move(( 的行为方式符合您的预期:要么文件被移动,要么保持原样。这是因为在单个文件系统内移动是从目录(磁盘上数据结构(中删除文件引用并将其添加到另一个目录的操作。如果发生错误,则操作将回滚:从源目录中的删除操作由相反的插入操作撤消。大多数现代文件系统都有内置的日志机制,可确保移动操作完全执行或完全回滚,即使计算机在操作过程中断电也是如此。

话虽如此,它仍然取决于,并非所有文件系统都提供这些保证。查看此研究

如果在 Windows 上运行,并且文件系统是本地的(不是网络共享(,则可以使用 Windows 的跨文档文件系统 (TxF( 功能来确保移动操作的原子性。

最新更新