我有一个文件夹:
c:\ test
我正在尝试以下代码:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
我得到异常:
文件已存在
输出目录肯定存在,输入文件在那里。
我有一个文件夹:
c:\ test
我正在尝试以下代码:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
我得到异常:
文件已存在
输出目录肯定存在,输入文件在那里。
Answers:
您需要的是:
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
}
File.Copy , File.Delete
过File.Move
?
你可以做一个P / Invoke来MoveFileEx()
-通过11对flags
(MOVEFILE_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作为参考之后。
根据File.Move的文档,没有“如果存在则覆盖”参数。您试图指定目标文件夹,但必须提供完整的文件规范。
我认为,再次阅读文档(“提供用于指定新文件名的选项”),可以在目标文件夹规范中添加反斜杠可能有效。
Move(String, String, Boolean)
。但这似乎是一个错误?
1)在.Net Core 3.0及更高版本上使用C#,现在有了第三个布尔参数:
参见https://docs.microsoft.com/zh-cn/dotnet/api/system.io.file.move?view=netcore-3.1
In .NET Core 3.0 and later versions, you can call Move(String, String, Boolean) setting the parameter overwrite to true, which will replace the file if it exists.
2)对于.Net的所有其他版本,https://stackoverflow.com/a/42224803/887092是最佳答案。复制并覆盖,然后删除源文件。这样做更好,因为它使其成为原子操作。(我尝试以此更新MS Docs)
尝试Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
。最后一个参数是“覆盖”开关,该参数System.IO.File.Move
没有。
如果您没有选择删除新位置中已经存在的文件,但仍需要从原始位置移动和删除,则此重命名技巧可能会起作用:
string newFileLocation = @"c:\test\Test\SomeFile.txt";
while (File.Exists(newFileLocation)) {
newFileLocation = newFileLocation.Split('.')[0] + "_copy." + newFileLocation.Split('.')[1];
}
File.Move(@"c:\test\SomeFile.txt", newFileLocation);
这假定唯一的“。” 文件名中的扩展名之前。它将文件扩展名一分为二,并附加“ _copy”。在两者之间。这使您可以移动文件,但是如果文件已经存在或副本的副本已经存在,或者副本的副本存在,则创建一个副本...;)