Можно ли переименовать файл на C, используя потоки каталогов?

Я новичок в C. Я написал эту программу, которая позволяет мне пакетно переименовывать файлы в одном каталоге (в основном показывает). В настоящее время он использует функцию Rename из stdio, а структуру dirent для поиска «старого имени». Однако это означает, что необходимо добавить «новое имя» и «старое имя» в «строку пути», чтобы Rename мог найти файлы. Я надеялся, что есть способ изменить имена файлов напрямую с помощью dirent.

Я попытался изменить dp-> d_name на «новое имя», но это не изменило имена файлов.

Это не моя полная рабочая программа, но код, который я использовал, чтобы попробовать другие методы переименования.

  #include  #  include  #include  int main () {DIR * dirp;  struct dirent * dp;  char dir [500];  char pathOne [500] = "Testing.txt";  int i;  printf (" nВведите целевой каталог:  n");  scanf ("% [^  n] s", директория);  dirp = opendir (dir);  printf (dirp? "Подключение к каталогу успешно  n  n": "Ошибка подключения к каталогу  n  n");  printf ("% s  n", pathOne);  while (dp = readdir (dirp)) {if ((dp-> d_name [0])! = '.') {for (i = 0; dp-> d_name [i] = pathOne [i]; i ++);  printf ("% s  n", dp-> d_name);  }} return 0;}  
  Введите целевой каталог: H:  Documents  TestFolderDirectory Connection SuccessfulTesting.txtTesting.txtTesting.txtTesting.txtНажмите любую клавишу, чтобы продолжить  .  .  .  

Это то, что я получаю в консоли, но имена файлов в проводнике не изменились.


struct dirent должен представлять структуру каталогов в программе, которую вы будете читать с помощью readdir , изменение его содержимого не повлияет на фактическую структуру каталога.

Структура предназначена для хранения определенной информации о конкретном файле в каталоге, поэтому у нее нет ссылки на фактический файл.

   struct dirent {ino_t d_ino; /* Номер инода */off_t d_off; /* Не смещение;  см. ниже */unsigned short d_reclen; /* Длина этой записи */unsigned char d_type; /* Тип файла;  поддерживается не всеми типами файловых систем */char d_name [256]; /* Имя файла с завершающим нулем */};  

Вы можете использовать системный вызов rename , чтобы переименовать фактический file .

Пример:

  while (dp = readdir (dirp)  ) {если ((dp-> d_name [0])! = '.') {char oldPath [1024], newPath [1024];  sprintf (oldPath, "% s/% s", dir, dp-> d_name);  sprintf (newPath, "% s/% s", dir, pathOne);  if (rename (oldPath, newPath)  

Оцените статью
techsly.ru
Добавить комментарий