Используя System.IO.File
или другой класс .NET
, как лучше всего переименовать файл?
Я хочу иметь возможность переименовывать файлы на локальных дисках или в локальных сетях.
Если использовать System.IO.File
, лучше Move
?
Используя System.IO.File
или другой класс .NET
, как лучше всего переименовать файл?
Я хочу иметь возможность переименовывать файлы на локальных дисках или в локальных сетях.
Если использовать System.IO.File
, лучше Move
?
System.IO.File.Move
Вы можете переименовать файл с помощью System.IO.File.Move
следующим образом:
var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
File.Move(sourcePath, destinationPath);
Вам может быть интересно сохранить одно и то же местоположение и просто изменить имя файла. Конечно, это можно сделать:
var sourcePath = @"C:\folder\oldname.txt";
var newName = "newname.txt";
var directory = Path.GetDirectoryName(sourcePath);
var destinationPath = Path.Combine(directory, newName);
File.Move(sourcePath, destinationPath);
System.IO.FileInfo.MoveTo
Вы также можете использовать System.IO.FileInfo.MoveTo
:
var sourcePath = @"C:\folder\oldname.txt";
var destinationPath = @"C:\folder\newname.txt";
FileInfo info = new FileInfo(sourcePath);
info.MoveTo(destinationPath);
Примечание. Вы также можете создать путь назначения, как показано выше.
"Движение руки"
Очевидно, вы всегда можете открыть существующий файл, создать новый с нужным именем... скопировать конкурсы от старого на новый и, наконец, удалить старый. Это будет работать, если у вас есть доступ на запись, хотя даты и информация о безопасности (владелец файла и т.д.) Не будут сохранены.
Вы можете увидеть пример этого при принятом решении Как записать содержимое одного файла в другой файл?.
Примечания
Примечание 1. Другие альтернативы включают в себя: Microsoft.VisualBasic.FileSystem.Rename
и Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
.
Оба Microsoft.VisualBasic.FileSystem.Rename
и System.IO.File.Move
эквивалентны, они выполняют проверку параметров, проверку прав доступа и обработку ошибок вокруг MoveFile
от kernel32
.
Относительно Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
он переименует файлы в той же папке, если указан полный путь и новое имя (аналогично тому, что я представил выше, чтобы создать путь назначения), а затем вернитесь к MoveFile
из kernel32
.
Аналогичным образом System.IO.FileInfo.MoveTo
вызовет MoveFile
из kernel32
.
Примечание 2. Следует также отметить, что вы не можете найти Microsoft.VisualBasic
из Mono. Это означает, что System.IO.File.Move
и System.IO.FileInfo.MoveTo
являются единственными переносимыми параметрами.
Как уже упоминалось выше, все эти методы возвратятся к MoveFile
из kernel32
. MoveFile
будет работать на любом смонтированном диске в системе (даже на сетевых дисках), хотя он не должен использоваться для перемещения из тома в другой. В этом случае необходимо будет скопировать файл в пункт назначения и удалить старый файл.
Так как Microsoft.VisualBasic.FileSystem.Rename
и Microsoft.VisualBasic.FileIO.FileSystem.RenameFile
не могут использоваться в других операционных системах, поскольку они не переносятся Mono, я отброшу их.
Итак, мы остаемся с System.IO.File.Move
и System.IO.FileInfo.MoveTo
. Между этими System.IO.File.Move
меньше накладных расходов, поскольку он не должен поддерживать состояние объекта FileInfo
. Кроме того, они будут работать одинаково... поэтому, если вы уже используете FileInfo
, используйте System.IO.FileInfo.MoveTo
иначе System.IO.File.Move
.
Итак, System.IO.File.Move
- лучший вариант для переименования файлов в .NET! (они не дали нам удачного API).
Празднуйте!