Подтвердить что ты не робот

File.Move не работает - файл уже существует

У меня есть папка:

C:\тест

Я пробую этот код:

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

Я получаю исключение:

Файл уже существует

Выходной каталог определенно существует, и есть входной файл.

4b9b3361

Ответ 1

Вам нужно переместить его в другой файл (а не в папку), это также можно использовать для переименования.

Move:

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

Rename:

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

Причина, по которой в вашем примере говорит "Файл уже существует", заключается в том, что C:\test\Test пытается создать файл Test без расширения, но не может сделать это, поскольку папка уже существует с тем же именем.

Ответ 2

Что вам нужно:

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.

Ответ 3

Лично я предпочитаю этот метод. Это перезапишет файл в месте назначения, удалит исходный файл и также не удалит исходный файл, если копия завершится с ошибкой.

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
}

Ответ 4

Вы можете выполнить 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 в качестве ссылки.

Ответ 5

Если файл действительно существует и вы хотите его заменить, используйте ниже код:

string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"

if (File.Exists(moveTo))
{
    File.Delete(moveTo);
}

File.Move(file, moveTo);

Ответ 6

В соответствии с документами для File.Move нет параметра "перезаписать, если существует". Вы попытались указать папку назначения , но вы должны указать полную спецификацию файла.

Чтение документов снова ( "предоставление опции для указания нового имени файла" ), я think, добавление обратной косой черты в спецификацию целевой папки может работать.

Ответ 7

Попробуйте Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True). Последний параметр - это переключатель "Перезаписать", которого нет в System.IO.File.Move.