File.Move不起作用 – 文件已经存在

我有一个文件夹:

C:\testing

我试着这个代码:

File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test"); 

我得到例外:

文件已存在

输出目录肯定存在,input文件在那里。

您需要将其移动到另一个文件(而不是文件夹),这也可以用于重命名。

移动:

 File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); 

改名:

 File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt"); 

在你的例子中说“File already exists”的原因是因为C:\test\Test试图创build一个没有扩展名的文件Test ,但是不能这样做,因为一个文件夹已经存在了同名的文件。

你需要的是:

 if (!File.Exists(@"c:\test\Test\SomeFile.txt")) { File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); } 

要么

 if (File.Exists(@"c:\test\Test\SomeFile.txt")) { File.Delete(@"c:\test\Test\SomeFile.txt"); } File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); 

这将会:

  • 如果文件在目标位置不存在,则成功移动该文件,或者;
  • 如果文件确实存在于目标位置,请将其删除,然后移动该文件。

编辑:我应该澄清我的答案,即使这是最有利的! File.Move的第二个参数应该是目标文件不是文件夹。 您将第二个参数指定为目标文件夹, 而不是目标文件名 – 这是File.Move所要求的。 所以,你的第二个参数应该是c:\test\Test\SomeFile.txt

我个人更喜欢这种方法。 这将覆盖目标上的文件,删除源文件,并防止复制失败时删除源文件。

 string source = @"c:\test\SomeFile.txt"; string destination = @"c:\test\test\SomeFile.txt"; try { File.Copy(source, destination, true); File.Delete(source); } catch { //some error handling } 

如果文件真的存在,你想要replace它使用下面的代码:

 string file = "c:\test\SomeFile.txt" string moveTo = "c:\test\test\SomeFile.txt" if (File.Exists(moveTo)) { File.Delete(moveTo); } File.Move(file, moveTo); 

根据File.Move文档没有“覆盖如果存在”参数。 您试图指定目标文件夹 ,但您必须提供完整的文件规范。

再次阅读文档(“提供选项来指定一个新的文件名”),我认为 ,添加一个反斜杠到目标文件夹规范可能工作。

您可以对MoveFileEx()执行P / Invoke – 为flags传递11MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH

 [return: MarshalAs(UnmanagedType.Bool)] [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)] static extern bool MoveFileEx(string existingFileName, string newFileName, int flags); 

或者,你可以打电话

 Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true); 

添加Microsoft.VisualBasic作为参考之后。