Как переименовать файл в C#? Простой и надёжный способ
Основной способ: File.Move
В C# нет отдельного метода "Rename" — переименование файла выполняется с помощью File.Move. По сути, вы перемещаете файл из одного имени в другое в той же папке. Это стандартный подход, который работает для любых расширений.
Проблема в вашем коде — отсутствие проверки существования целевого файла. Вот исправленный вариант:
string oldPath = @"C:\temp\old_file.txt";
string newPath = @"C:\temp\new_file.txt";
if (!File.Exists(newPath))
{
File.Move(oldPath, newPath);
Console.WriteLine("Файл переименован успешно.");
}
else
{
Console.WriteLine("Файл с таким именем уже существует.");
}
Перезапись существующего файла
Если вам нужно перезаписать существующий файл, используйте перегрузку File.Move с третьим параметром — overwrite:
File.Move(oldPath, newPath, overwrite: true);
// или
File.Move(oldPath, newPath, true);
Работа с разными расширениями
Переименование с изменением расширения работает так же — просто укажите новое имя с нужным расширением:
string txtFile = @"C:\data\report.txt";
string csvFile = @"C:\data\report.csv";
File.Move(txtFile, csvFile);
// Файл будет переименован, содержимое останется прежним
Обработка ошибок
Всегда оборачивайте операции с файлами в try-catch. Основные исключения:
IOException— файл занят или произошла ошибка ввода-выводаUnauthorizedAccessException— недостаточно правDirectoryNotFoundException— папка не существует
try
{
File.Move(oldPath, newPath, overwrite: true);
}
catch (IOException ex)
{
Console.WriteLine($"Файл занят или произошла ошибка: {ex.Message}");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("Нет прав на переименование файла.");
}
catch (Exception ex)
{
Console.WriteLine($"Неожиданная ошибка: {ex.Message}");
}
Асинхронная версия (для .NET Core 3.0+)
await File.MoveAsync(oldPath, newPath, overwrite: true);
Перемещение в другую папку
Если нужно переименовать и переместить файл в другую папку, просто укажите полный новый путь:
string source = @"C:\temp\old.txt";
string destination = @"D:\archive\new.txt";
File.Move(source, destination);
Важно: File.Move работает только в пределах одного логического диска. Для перемещения между дисками используйте File.Copy + File.Delete.
Альтернативный подход: FileInfo.RenameTo
В .NET также есть класс FileInfo, который предоставляет метод MoveTo (аналог File.Move). Хотя отдельного RenameTo нет, можно использовать FileInfo для более объектно-ориентированного подхода:
FileInfo file = new FileInfo(@"C:\temp\old_file.txt");
string newPath = @"C:\temp\new_file.txt";
if (file.Exists)
{
file.MoveTo(newPath, overwrite: true);
Console.WriteLine("Файл переименован через FileInfo.");
}
else
{
Console.WriteLine("Исходный файл не найден.");
}
Когда это удобно
- Если вы уже работаете с
FileInfoдля других операций (проверка размера, даты создания и т.д.) - Если нужно выполнить несколько операций с одним файлом — проще держать объект
FileInfo - Метод
Refresh()позволяет обновить свойства объекта после переименования
Недостатки
Для простого переименования File.Move короче и понятнее. FileInfo создаёт лишний объект, что может быть неоптимально при массовых операциях.
Также можно использовать Directory.Move для переименования папок — принцип тот же.