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

Как переименовать файл в .NET?

Используя System.IO.File или другой класс .NET, как лучше всего переименовать файл?

Я хочу иметь возможность переименовывать файлы на локальных дисках или в локальных сетях.

Если использовать System.IO.File, лучше Move?

4b9b3361

Ответ 1


Альтернативы

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.

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

Празднуйте!