C как переименовать файл
Перейти к содержимому

C как переименовать файл

  • автор:

Статья 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\

После чего добавляем новое имя файла и расширение.

Функция rename

Функция rename изменяет имя файла или каталога, указанного в oldfilename на новое имя, указанное в newfilename .
Если в oldfilename и newfilename указать разные пути, и, если это поддерживается системой, файл будет перемещен в новое место.
Эта операция производится непосредственно с файлом, нет потоков, участвующих в операции.

Параметры:

  • oldfilename
    Cи-строка, содержащая имя файла, который будет переименован и (или) перемещен. Этот файл должен существовать и быть доступным.
  • newfilename
    Cи-строка, содержащая новое имя файла. Она не должно быть именем существующего файла, если это так, то результат работы программы будет непредсказуем, а точнее, он будет зависеть от того, как среагирует используемая ОС, может быть или отказ или переопределение.

Возвращаемое значение

Если файл успешно переименован, возвращается нулевое значение.
В случае ошибки, возвращается ненулевое значение и макрос ERRNO инициализируется соответствующим кодом ошибки.

Ошибка — числовое значение, представляющее тип сбоя.

Строка, интерпретирующая это значение может быть выведена на стандартный поток ошибок при вызове функции perror .

Пример: исходный код программы

// пример использования функции: rename для переименования файла #include // для оператора cout #include // для функции rename int main () < char oldfilename[] = "oldfilename.txt"; // старое имя файла char newfilename[] = "newfilename.txt"; // новое имя файла if ( rename( oldfilename, newfilename ) == 0 ) // переименование файла std::cout

Пример работы программы

Если файл oldfilename.txt может быть успешно переименован в newfilename.txt , следующее сообщение будет выведено на стандартный вывод:

CppStudio.com
Файл успешно переименован

В противном случае, сообщение, похожее на это будет показано на экране:

Переименование файлов

Как сделать такое задание: Перед каждым именем файла (regular file) вставить его номер (1, 2, 3 и т. д.). Номер выставляется в соответствии с тем, в каком порядке выдает результаты функция FindFirstFile, FindNextFile. Смог сделать только это:

#include #include #include using namespace std; //strcpy, strcat //_tcscpy,_tcscat int main() < DWORD dwError = 0; setlocale(LC_ALL, "rus"); WIN32_FIND_DATA find; HANDLE hFind = FindFirstFile(_T("C:\\test\\*"), &find); < if (INVALID_HANDLE_VALUE == hFind) < cout do < if (!(find.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) && !(find.dwFileAttributes == FILE_ATTRIBUTE_DEVICE)) _tprintf(_T("%s\n"), find.cFileName); >while (FindNextFile(hFind, &find) != NULL); dwError = GetLastError(); if (dwError == ERROR_NO_MORE_FILES) < FindClose(hFind); cout >////нет проверки на успешность FindFirstFile FindClose(hFind); ////нет проверки на успешность FindClose cout

А как переименовывать файлы не понимаю
Отслеживать
задан 6 янв 2017 в 15:05
21 1 1 серебряный знак 2 2 бронзовых знака

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Для переименования файлов есть сишная функция rename()

int rename(const char *old_filename, const char *new_filename) 
BOOL WINAPI MoveFile( _In_ LPCTSTR lpExistingFileName, _In_ LPCTSTR lpNewFileName ); 

Но учтите, что переименовывать файлы внутри цикла FindFirstFile / FindNextFile нельзя. Иначе цикл будет находить новые файлы.

Вам нужно в этом цикле сложить все имена файлов в массив, вызвать FindClose() , а потом пробежаться по этому массиву и переименовать файлы

rename , _wrename

Каждая из этих функций возвращает значение 0, если это успешно. При возникновении ошибки функция возвращает ненулевое значение и задает для errno одно из следующих значений:

Значение errno Condition
EACCES Файл или каталог, newname указанные уже существует или не удалось создать (недопустимый путь), или oldname каталог и newname указывает другой путь.
ENOENT Файл или путь, указанный oldname не найден.
EINVAL Имя содержит недопустимые символы.

Другие возможные возвращаемые значения см. в разделе _doserrno , _errno syserrlist и _sys_nerr .

Замечания

Функция rename переименовывает файл или каталог, oldname указанный именем, заданным newname . Старое имя должно быть путем к существующему файлу или каталогу. Новое имя не должно быть путем к существующему файлу или каталогу. Можно использовать rename для перемещения файла из одного каталога или устройства в другой, предоставив другой путь в аргументе newname . Однако вы не можете использовать rename для перемещения каталога. Каталоги можно переименовать, но нельзя перемещать.

_wrename — это двухбайтовая версия _rename ; аргументы для _wrename представляют собой двухбайтовые строки. Поведение _wrename и _rename идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H Обычной _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_trename rename rename _wrename

Требования

Маршрут Обязательный заголовок
rename или
_wrename или

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

Пример

// crt_renamer.c /* This program attempts to rename a file named * CRT_RENAMER.OBJ to CRT_RENAMER.JBO. For this operation * to succeed, a file named CRT_RENAMER.OBJ must exist and * a file named CRT_RENAMER.JBO must not exist. */ #include int main( void ) < int result; char old[] = "CRT_RENAMER.OBJ", new[] = "CRT_RENAMER.JBO"; /* Attempt to rename file: */ result = rename( old, new ); if( result != 0 ) printf( "Could not rename '%s'\n", old ); else printf( "File '%s' renamed to '%s'\n", old, new ); >

Выходные данные

File 'CRT_RENAMER.OBJ' renamed to 'CRT_RENAMER.JBO' 

См. также

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see: https://aka.ms/ContentUserFeedback.

Отправить и просмотреть отзыв по

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *