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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(){

  DIR *dirp;
  struct dirent *dp;
  char dir[500];
  char pathOne[500] = "Testing.txt";
  int i;


  printf("\nPlease enter the target directory :\n");
  scanf("%[^\n]s",dir);

  dirp = opendir(dir);

  printf(dirp ? "Directory Connection Successful\n\n" : "Directory Connection Failed\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;
}
Please enter the target directory :
H:\Documents\TestFolder
Directory Connection Successful

Testing.txt
Testing.txt
Testing.txt
Testing.txt

Press any key to continue . . .

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


person Robin Butel    schedule 19.06.2019    source источник
comment
Используйте opendir(3) и readdir(3). Обратите внимание, что C11 ничего не знает о каталогах.   -  person Basile Starynkevitch    schedule 19.06.2019


Ответы (1)


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

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

   struct dirent {
       ino_t          d_ino;       /* Inode number */
       off_t          d_off;       /* Not an offset; see below */
       unsigned short d_reclen;    /* Length of this record */
       unsigned char  d_type;      /* Type of file; not supported
                                      by all filesystem types */
       char           d_name[256]; /* Null-terminated filename */
   };

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

Пример:

  while(dp = readdir(dirp)){
    if((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) < 0)
        printf("rename error path=%s", oldPath);
    }
  }
person kiran Biradar    schedule 19.06.2019