У мене є папка:
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 . Скопіюйте за допомогою Overwrite, а потім видаліть вихідний файл. Це краще, оскільки це робить це атомною операцією. (Я намагався оновити Документи MS цим)
Спробуйте 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". між. Це дозволяє переміщати файл, але створює копію, якщо файл вже існує або копія копії вже існує, або копія копії копії існує ...;)