Avatar ·

Как переименовать файл в C#? Простой и надёжный способ

Всем привет! Я новичок в C# и пишу небольшую программу для работы с текстовыми файлами. Мне нужно переименовать файл после того, как я его обработаю. Я пробовал использовать File.Move, но что-то пошло не так. Вот мой код: ```csharp string oldPath = @"C:\temp\old_file.txt"; string newPath = @"C:\temp\new_file.txt"; File.Move(oldPath, newPath); ``` Но я получаю исключение, если файл уже существует. Как правильно переименовать файл в C#, чтобы избежать таких ошибок? Нужно ли проверять, существует ли файл, или есть более простой способ? Также хотелось бы понять, как это работает с разными расширениями (например, переименовать .txt в .csv) и как обрабатывать случаи, когда файл занят другим процессом. Заранее спасибо за помощь! <<>>

Основной способ: 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 для переименования папок — принцип тот же.