У меня есть папка:
c: \ test
Я пробую этот код:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Я получаю исключение:
Файл уже существует
Выходной каталог определенно существует, и входной файл есть.
У меня есть папка:
c: \ test
Я пробую этот код:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Я получаю исключение:
Файл уже существует
Выходной каталог определенно существует, и входной файл есть.
Ответы:
Вам нужно переместить его в другой файл (а не в папку), это также можно использовать для переименования.
Переехать:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Переименовать:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
Причина, по которой в вашем примере написано «Файл уже существует», заключается в том, что он C:\test\Testпытается создать файл 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
}
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 в качестве ссылки.
Если файл действительно существует, и вы хотите его заменить, используйте следующий код:
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 нет параметра «перезаписать, если существует». Вы пытались указать папку назначения , но вы должны указать полную спецификацию файла.
Прочитав документы еще раз («предоставление возможности указать новое имя файла»), я думаю , что добавление обратной косой черты к спецификации целевой папки может сработать.
Move(String, String, Boolean)вместо этого позвоните . но это кажется ошибкой?
1) В C # в .Net Core 3.0 и выше теперь есть третий логический параметр:
см. https://docs.microsoft.com/en-us/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». между. Это позволяет вам переместить файл, но создает копию, если файл уже существует, или копия копии уже существует, или копия копии копии существует ...;)