Как переименовать файл или папку на C#
В данной краткой статье-заметке рассказано как переименовать файл на языке C#. Есть два основных способа переименования с использованием классов для работы с файловой системой.
Переименование файла
Для переименования файлов можно использовать метод Move класса File. Этот метод так же используется для переноса файлов в другую папку, но если папка не поменялась, а поменялось только имя файла, то получается переименование. Пример:
using System.IO; . File.Move("e:\\Temp\\123.txt", "e:\\Temp\\001.txt");
В случае, если файла, который переименовывается нет, произойдет ошибка.
Переименование файла или папки
Для переименования папки (директории) или файла можно использовать метод MoveTo класса FileInfo (может переименовать и файл и папку). Пример:
using System.IO; . // Переименование файла FileInfo fi = new System.IO.FileInfo(«e:\\temp\\123.txt»); if (fi.Exists) < fi.MoveTo("e:\\temp\\0123.txt"); >// Переименование папки FileInfo fl = new System.IO.FileInfo(«e:\\temp\\Folder1»); if (fi.Exists)
Переименование папки (директории)
Папку можно переименовать так же методом Move класса Directory
using System.IO; . Directory.Move("e:\\temp\\Folder01", "e:\\temp\\Folder02");
Переименование файла, если он существует
подскажите пожалуйста, почему к первому файлу применяется цикл нормально и он сначала с расширением .b,а потом его копирует и получается 2 файла 1.exe и 1.exe.b, а к остальным файлам применяется сразу с .b ? Нужно чтобы сравнивал имена, если такой файл есть ,то в той папке где он есть, ему было дописано в конце «.b». А второй сразу же копируется с расширением «2.b». Цикл While для примера. Нужно чтобы если C:\Users\Admin\Desktop\papka1\1.exe == C:\Users\Admin\Desktop\papka2\1.exe , то в papka2 , файл 1.exe — стал 1.exe.b и скопировался из papka 1 с расширением .ехе — как пример. И так каждый раз при проверке,если файл существует ,то нужен его ренейм ..b в papka2.в не зависимости от расширения. Думаю нужно именно через Process и ренейм, так как именно он может реализовать ренейм открытых процессов.
string firstDir = @"C:\Users\Admin\Desktop\papka1"; string secondDir = @"C:\Users\Admin\Desktop\papka2"; while (true) < // цикл для примера try < foreach (string filePath in Directory.EnumerateFiles(firstDir)) < string fileName = Path.GetFileName(filePath); string targetPath = Path.Combine(secondDir, fileName); Process process = new Process(); ProcessStartInfo startInfo = new ProcessStartInfo(); if (File.Exists(targetPath)) // если файл уже существует, то в targetPath к файлу дописывается .b < string result = Path.GetFileName(targetPath); startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.FileName = "cmd.exe"; startInfo.Arguments = "/C Rename " + " " + targetPath + " " + result + ".b"; process.StartInfo = startInfo; process.Start(); >File.Copy(filePath, targetPath); // копирует файлы во вторую папку ( в этот момент уже дубль файла с дописью .b) > > catch (Exception ex) < Console.Write(ex.Message); >>
Отслеживать
50k 6 6 золотых знаков 25 25 серебряных знаков 60 60 бронзовых знаков
задан 15 авг 2022 в 16:49
19 5 5 бронзовых знаков
process.WaitForExit();
15 авг 2022 в 17:23
Пробелы в именах папок/файлов есть? Тогда нужно закавычить путь.
15 авг 2022 в 17:24
Зачем здесь Process? Если можно File.Move?
15 авг 2022 в 17:24
@aepot я только учусь,хочется разобраться,через File.Move не получилось из-за того что на открытый ехе ругался,что процесс занят и не смог ренейм сделать
15 авг 2022 в 18:17
Так открытый exe вы никак не подмените, ни через Move, не через шелл.
Статья C# Как переименовать файл?
В этой заметке будет показано, как можно получить и изменить имена и расширения всех файлов в выбранной вами папке.
Решение:
Для начала создадим обычное Windows Forms приложение, после чего на форму поместим одну кнопку и один control folderBrowserDialog, который переименуем в fbd.
Поместите код в обработчик события Button.Click
private void button1_Click(object sender, EventArgs e) < //с помощью диалога выбираем папку с файлами DialogResult result = fbd.ShowDialog(); if (result == DialogResult.OK) < //Получить все файлы в папке string [] files = Directory.GetFiles(fbd.SelectedPath); int ind = 0; for (int i=0; i < files.Length; i++) < //поиск индекса последнего слеша ind = files[i].LastIndexOf('\\'); //переименование File.Move(files[i], files[i].Remove(ind + 1) + i +".txt"); >MessageBox.Show("Готово!"); > >
Основные моменты
using System.IO;
1. Получаем все файлы в выбранной директории и загоняем их в массив.
Содержимое массива files:
files[0] = C:\ff\Текстовый документ.txt files[1] = C:\ff\Текстовый документ(2).txt
Как видно в массиве храниться полный путь к каждому файлу.
2. Переименование файла будет осуществляться при помощи метода Move, в который передается два параметра: полный путь к файлу, который нужно перенести или переименовать и новый путь + новое имя файла, либо текущий путь + новое имя файла.
Так как в этом примере файл перемещать не требуется, то изменим лишь только имя файла.
File.Move(@"C:\ff\Текстовый документ.txt", @"C:\ff\0.txt");
3. Первый параметр у нас уже есть, он хранится в массиве files, осталось получить второй параметр.
Для начала нужно удалить старое имя файла
C:\ff\ — путь Текстовый документ — имя файла .txt — расширение
Воспользуемся методом LastIndexOf(), который в строке
C:\ff\Текстовый документ.txt
найдет индекс последнего слеша после чего, используя метод Remove, удалим всё, что идёт после него.
C:\ff\Текстовый документ.txt -> C:\ff\
После чего добавляем новое имя файла и расширение.
File System. Rename(String, String) Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Переименовывает файл или каталог на диске. Функция My обеспечивает более высокие показатели производительности и быстродействия в операциях файлового ввода-вывода в сравнении с Rename . Для получения дополнительной информации см. FileSystem.
public: static void Rename(System::String ^ OldPath, System::String ^ NewPath);
[System.Runtime.Versioning.SupportedOSPlatform("windows")] public static void Rename (string OldPath, string NewPath);
public static void Rename (string OldPath, string NewPath);
[] static member Rename : string * string -> unit
static member Rename : string * string -> unit
Public Sub Rename (OldPath As String, NewPath As String)
Параметры
Обязательный. Строковое выражение, указывающее имя и расположение существующего файла. Выражение OldPath может содержать имя каталога и метку диска для файла.
Обязательный. Строковое выражение, указывающее имя и расположение нового файла. Параметр NewPath может содержать имя каталога и метку диска для нового местонахождения файла. Имя файла, заданного параметром NewPath не может быть именем существующего файла.
Исключения
Файл OldPath не существует.
Нельзя переименовать с указанием другого диска.
Примеры
В этом примере используется Rename функция для переименования файла. В этом примере предполагается, что указанные каталоги уже существуют.
Dim OldName, NewName As String OldName = "OLDFILE" ' Define file names. NewName = "NEWFILE" ' Rename file. Rename(OldName, NewName) OldName = "C:\OLDDIR\OLDFILE" NewName = "C:\NEWDIR\NEWFILE" ' Move and rename file. Rename(OldName, NewName)
Комментарии
Функция Rename переименовывает файл и при необходимости перемещает его в другой каталог. Функция Rename может перемещать файл между дисками, но переименовывать существующий каталог можно только в том случае, если NewPath и находятся OldPath на одном диске. Rename Не удается создать новый файл или каталог.
Rename При использовании функции в открытом файле возникает ошибка. Перед переименованием необходимо закрыть открытый файл. Rename Аргументы не могут включать подстановочные знаки из нескольких символов (*) и односимвого (?).
При использовании для Rename копирования файла из незащищенного расположения в защищенное расположение файл сохраняет менее ограниченные права. Убедитесь, что вы не представляете возможный риск безопасности.