是否.NET File.Move复制然后删除

时间:2014-03-13 20:10:16

标签: c#-4.0

到目前为止,当我必须跨共享移动文件时,我使用如下代码:

  • 使用File.Copy方法将文件复制到目标
  • 使用File.Exists检查文件是否已成功复制
  • 删除来源

我使用了上述过程,因为我认为您无法使用File.Move在共享或卷之间移动文件。在今天挖掘了一下后,我意识到你可以这样做,所以我的下一个问题是如何处理故障,即底层.NET代码是否实际复制然后删除文件?

我在reference source检查了File.Move代码,看到它实际上调用了Windows MoveFile API。

所以我的问题是,我可以安全地使用File.Move在UNC路径上移动文件吗?

1 个答案:

答案 0 :(得分:2)

我可能错了,但似乎你确实得到了复制后删除语义。

MoveFile

  

要指定如何移动文件,请使用MoveFileEx或   MoveFileWithProgress功能。要执行此操作   交易操作,使用MoveFileTransacted函数。

这意味着MoveFile不提供事务语义或保证“文件如何移动”(文档中没有其他内容引用此类文件)。

另一方面,

MoveFileEx表示

  

移动文件时,目标可以位于不同的文件系统上   或音量。如果目标位于另一个驱动器上,则必须设置   MOVEFILE_COPY_ALLOWED中的dwFlags标记。

MOVEFILE_COPY_ALLOWED的效果是

  

如果要将文件移动到其他卷,则该功能   使用CopyFileDeleteFile函数模拟移动。如果   该文件已成功复制到其他卷和原始文件   文件无法删除,功能成功离开源   档案完整。

我解释这一点的方式是,由于MoveFileEx在移动卷时没有为您提供处理选项,因此MoveFile也适用于该模式。< / p>

此外,跨卷移动意味着可能跨文件系统甚至机器移动(特别是在使用UNC路径时)。在这种情况下,除了逐步复制其内容之外,无法将文件放在其目标路径中,这似乎几乎可以保证操作将是复制后删除。