File.Move() 会删除 IoException 上的原件吗?
Does File.Move() deletes original on IoException?
我有一个 web 服务正在写入由不同程序读取的文件。
为了防止 reader 程序在它们完成写入之前读取它们,我用 .tmp 扩展名编写它们,然后使用 File.Move 将它们重命名为 .xml 扩展。
我的问题是,当我们 运行 大量使用时 - 仅几分钟内就有数千个文件。
我已成功写入文件“12345.tmp”,但是当我尝试重命名它时,File.Move()
抛出 IOException
:
File.Move("12345.tmp", "12345.xml")
Exception: The process cannot access the file because it is being used
by another process.
对于我的情况,我不太关心文件名是什么,所以我重试:
File.Move("12345.tmp", "12346.xml")
Exception: Exception: Could not find file '12345.tmp'.
如果重命名文件时遇到错误,是否File.Move()
删除源文件?
为什么?
有没有办法确保文件重命名成功或保持不变?
答案是这在很大程度上取决于文件系统本身是如何实现的。此外,如果 Move() 在两个文件系统之间(如果路径是网络共享,甚至可能在两台机器之间)——那么它也很大程度上取决于 Move() 的 O/S 实现。因此,保证更少地依赖于 System.IO.File 所做的事情,更多地依赖于底层机制:O/S 代码、文件系统驱动程序、文件系统结构等
一般来说,在绝大多数情况下,Move() 会按您预期的方式运行:文件被移动或保持原样。这是因为单个文件系统中的 Move 是一种从一个目录(磁盘数据结构)中删除文件 reference 并将其添加到另一个目录的行为。如果发生了不好的事情,那么操作就会回滚:从源目录中删除的操作会被相反的插入操作撤消。大多数现代文件系统都有内置的日志机制,确保移动操作完全执行或完全回滚,即使机器在操作过程中断电。
综上所述,这仍然取决于,并非所有文件系统都提供这些保证。 See this study
如果您 运行 超过 Windows,并且文件系统是本地的(不是网络共享),那么您可以使用 Windows 的 Transacitonal File System (TxF) feature 来确保移动操作的原子性。
我有一个 web 服务正在写入由不同程序读取的文件。
为了防止 reader 程序在它们完成写入之前读取它们,我用 .tmp 扩展名编写它们,然后使用 File.Move 将它们重命名为 .xml 扩展。
我的问题是,当我们 运行 大量使用时 - 仅几分钟内就有数千个文件。
我已成功写入文件“12345.tmp”,但是当我尝试重命名它时,File.Move()
抛出 IOException
:
File.Move("12345.tmp", "12345.xml")
Exception: The process cannot access the file because it is being used by another process.
对于我的情况,我不太关心文件名是什么,所以我重试:
File.Move("12345.tmp", "12346.xml")
Exception: Exception: Could not find file '12345.tmp'.
如果重命名文件时遇到错误,是否File.Move()
删除源文件?
为什么?
有没有办法确保文件重命名成功或保持不变?
答案是这在很大程度上取决于文件系统本身是如何实现的。此外,如果 Move() 在两个文件系统之间(如果路径是网络共享,甚至可能在两台机器之间)——那么它也很大程度上取决于 Move() 的 O/S 实现。因此,保证更少地依赖于 System.IO.File 所做的事情,更多地依赖于底层机制:O/S 代码、文件系统驱动程序、文件系统结构等
一般来说,在绝大多数情况下,Move() 会按您预期的方式运行:文件被移动或保持原样。这是因为单个文件系统中的 Move 是一种从一个目录(磁盘数据结构)中删除文件 reference 并将其添加到另一个目录的行为。如果发生了不好的事情,那么操作就会回滚:从源目录中删除的操作会被相反的插入操作撤消。大多数现代文件系统都有内置的日志机制,确保移动操作完全执行或完全回滚,即使机器在操作过程中断电。
综上所述,这仍然取决于,并非所有文件系统都提供这些保证。 See this study
如果您 运行 超过 Windows,并且文件系统是本地的(不是网络共享),那么您可以使用 Windows 的 Transacitonal File System (TxF) feature 来确保移动操作的原子性。