File.Move не работает - файл уже существует - PullRequest
72 голосов
/ 07 мая 2011

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

c: \ test

Я пытаюсь этот код:

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

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

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

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

Ответы [ 7 ]

124 голосов
/ 07 мая 2011

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

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.

56 голосов
/ 07 мая 2011

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

Move:

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 без расширения, но не может этого сделать, поскольку папка с таким именем уже существует.

29 голосов
/ 14 февраля 2017

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

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
}
11 голосов
/ 14 июля 2016

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

9 голосов
/ 19 августа 2015

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

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

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

File.Move(file, moveTo);
4 голосов
/ 07 мая 2011

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

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

0 голосов
/ 18 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...