Mimic File.Move如果目标已存在

File.Move的文档:

请注意,如果您尝试通过将同名文件移动到该目录来替换文件,则会出现IOException。 您不能使用Move方法覆盖现有文件。

简而言之,你不能在Move覆盖,所以为了便于覆盖Move,我通过执行File.Copy后跟File.Delete模仿行为。 就像是:

 if (File.Exists(dstFileName)) { // System.IO.File.Move cannot be used to overwrite existing files, so we're going // to simulate that behavior with a Copy & Delete. File.Copy(procContext.FileName, dstFileName); File.Delete(procContext.FileName); } else File.Move(procContext.FileName, dstFileName); 

我的问题是:是否有任何我需要防范的情况可能会导致源文件被删除而不首先被成功复制?

我从阅读文档中得到的理解是,由于File.Copy不会返回任何在任何情况下都不会成功的情况下应该抛出exception。 有没有人遇到过任何不真实的情况?

我建议你首先探查目标文件是否存在,如果是,则删除它。 然后执行正常的移动操作。

由于此序列不是primefaces序列,因此如果目标存在,您可能希望重命名它而不是删除它,以避免在移动失败时丢失它。

正确的方法是打电话

 File.Replace(source, destination, copy) 

这对我有用

如果操作系统没有为您提供良好的primefaces操作,则很难模拟primefaces操作。 Move在某些但不是所有文件系统上都是primefaces的,但在将磁盘移动到磁盘时则不是。

在相同磁盘的情况下, Delete + Move有点优雅(快速且安全),因为它不会以任何方式填充数据。 你可以进一步扩展到

 try { Move(dest, tmp); Move(src, dest); Delete(tmp); } catch { try { Move(tmp, dest); } catch { } throw; } 

(例如,当您没有完成移动所需的权限时,这将使您丢失目标文件的可能性降低。)

在您不知道它是同一磁盘的情况下,您的解决方案足够安全且足够简单。 但是,它甚至可以在同一磁盘中复制数据,从而为您提供更大的电源故障风险窗口。

这很安全。 File.Copy将完全成功或抛出。 当然,删除可能会失败,将源文件保留为垃圾。

但是,如果您的计算机崩溃,则无法保证复制操作已使数据变硬。 在这种情况下,您可能会丢失数据。

在正常操作期间,这是安全的。

检查文件“目标”是否存在。 如果不是,请复制您的文件。

如果是:将“目标”移动到临时目录,您可以确定移动将成功。 您可以在Temp中生成一个名为auf和UUID的子目录。 然后复制您的文件。