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

时间:2011-04-18 15:11:06

标签: c# io

我们有一个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)

我们对该方法的调用进行了错误处理,但是我们无法弄清楚为什么File.Delete无效并且没有抛出任何东西。

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

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

5 个答案:

答案 0 :(得分:12)

你能扭转逻辑吗?

File.Copy (source, target, true) 

覆盖目标

File.Delete(source)

答案 1 :(得分:4)

过去,我发现系统往往会删除文件“比程序运行速度慢”。

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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

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

以便overwrite = true

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

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

答案 4 :(得分:0)

这是避免复制或轮询删除的更好方法--- 我们假设我们有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");

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