是否可以使用目录流在C语言中重命名文件?

时间:2019-06-19 09:15:43

标签: c file stream rename dirent.h

我是C的新手。 我已经编写了该程序的代码,该程序使我可以在同一目录中批量重命名文件(大部分显示)。它当前正在使用stdio的Rename函数,同时使用dirent结构查找“旧名称”。但是,这意味着必须在“路径字符串”中添加“新名称”和“旧名称”,以便“重命名”可以找到文件。我希望有一种方法可以直接使用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 . . .

这是我在控制台中看到的,但资源管理器中的文件名未更改。

1 个答案:

答案 0 :(得分:2)

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);
    }
  }