我们有一个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
因“文件已存在”而失败?
答案 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");
这消除了在将新文件移动到原始文件时删除原始文件的情况。