Mimic File.Move如果目的地已经存在

时间:2012-04-24 20:02:30

标签: c# file copy

来自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没有返回任何内容,因此它应该在任何情况下都不会成功。有没有人遇到过任何不符合这种情况的情况?

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

正确的方法是致电

File.Replace(source, destination, copy)

这对我有把戏

答案 2 :(得分:4)

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

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

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

(例如,如果您没有完成移动所需的权限,则会丢失目标文件的可能性降低。)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

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

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