У меня есть папка:
C:\тест
Я пробую этот код:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Я получаю исключение:
Файл уже существует
Выходной каталог определенно существует, и есть входной файл.
У меня есть папка:
C:\тест
Я пробую этот код:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Я получаю исключение:
Файл уже существует
Выходной каталог определенно существует, и есть входной файл.
Вам нужно переместить его в другой файл (а не в папку), это также можно использовать для переименования.
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
без расширения, но не может сделать это, поскольку папка уже существует с тем же именем.
Что вам нужно:
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
}
Вы можете выполнить 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 нет параметра "перезаписать, если существует". Вы попытались указать папку назначения , но вы должны указать полную спецификацию файла.
Чтение документов снова ( "предоставление опции для указания нового имени файла" ), я think, добавление обратной косой черты в спецификацию целевой папки может работать.
Попробуйте Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Последний параметр - это переключатель "Перезаписать", которого нет в System.IO.File.Move
.