File.Move在前面有File.Delete时失败

我们有一个MoveFile方法,通常可以工作,但在客户站点仍然失败。

if (File.Exists(target)) { File.Delete(target); } File.Move(source, target); 

File.Move的调用反复失败

 System.IO.IOException: Cannot create a file when that file already exists. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError() at System.IO.File.Move(String sourceFileName, String destFileName) 

我们有围绕调用该方法的error handling,但我们无法弄清楚为什么File.Delete不工作并且没有抛出任何东西。

我们虽然关于文件权限,但是File.Delete会抛出UnauthorizedAccessException

在删除该特定文件之前,是否有任何其他原因导致File.Move失败,并且“文件已存在”?

你能扭转逻辑吗?

 File.Copy (source, target, true) 

然后覆盖目标

 File.Delete(source) 

在过去,我发现系统倾向于删除文件“慢”,而不是程序运行。

理想情况下,在尝试将文件移动到其位置之前,您需要检查文件是否已被删除。 通常你可以通过一个简单的Thread.Sleep(200)或类似方法绕过它,但它可能不是最可靠的方式!

我相信如果其他人使用FileShare.Delete选项打开文件(即允许删除),就会发生这种情况。 在这种情况下,文件将被标记为删除,但在关闭另一个句柄之前不会实际删除。

我不确定哪些进程可以以这种方式打开文件 – 防病毒软件是一种可能性。

我想你可能会得到更好的结果:

 System.IO.File.Copy(sourceFileName, destFileName, overwrite); 

所以overwrite = true

这将覆盖旧文件(如果存在),而不是担心单独删除它。

然后,您可以根据需要删除原始文件。

这是避免复制或轮询删除的更好方法—
我们假设我们有File_A和File_B。 我们想通过File_A移动File_B。
脚步:
1)将File_A重命名(移动)到第三个名称File_C。
2)删除File_C。
3)将File_B重命名(移动)到File_A。

 File.Move("File_A", "File_C"); File.Delete("File_C"); File.Move("File_B", "File_A"); 

这消除了在将新文件移动到原始文件时,删除原始文件的情况。