2014-10-01 277 views
0

我想用下划线替换空格字符并重命名目录中的文件名。一切看起来不错,但重命名操作不重命名文件。重命名文件名C++

DIR *dir; 
char *directoryPath = "E:\\markdown-here.wiki\\LeetCode_problems_solution\\"; 
struct dirent *ent; 
if ((dir = opendir (directoryPath)) != NULL) { 
    while ((ent = readdir (dir)) != NULL) { 
     char *filename; 
     for(int i = 0; i < strlen(ent->d_name); ++i) { 
      if(ent->d_name[i] == ' ') 
       filename[i] = '_'; 
      else filename[i] = ent->d_name[i]; 
     } 
     filename[strlen(ent->d_name)] = '\0'; 

     // output: Error renaming file: No such file or directory 
     int result = rename(ent->d_name, filename); 
     if(result == 0) puts ("File successfully renamed"); 
     else perror("Error renaming file"); 

     // this works 
     printf ("%s, %s\n", ent->d_name, filename); // foo bar, foo_bar 
    } 
    closedir (dir); 
} else { 
    /* could not open directory */ 
    perror (""); 
    return EXIT_FAILURE; 
} 

这里有什么问题?

+0

你从'perror'得到什么信息? – 2014-10-01 22:23:08

+0

重命名文件时出错:没有这样的文件或目录 – 2014-10-01 22:23:23

+0

变量filename没有初始化,甚至没有初始化 – kotlomoy 2014-10-01 22:24:09

回答

2

的主要问题是,你必须:

char *filename; 

,但它尚未分配的内存。您遇到未定义的行为。

尝试

char filename[1000]; // Or something large enough. 

此外,您使用rename的方式,它只会在当前目录设置为directoryPath工作,否则ent->d_name是不是一个有效的文件名。

您可以chdirdirectoryPath或在参数rename中使用绝对路径。

+0

感谢您的回答。我改变了它,但没有工作:( – 2014-10-01 22:26:49

+0

@KaidulIslam,看到我的更新 – 2014-10-01 22:36:32

+0

谢谢!不是添加绝对路径前缀,我已经从同一目录执行此源文件,现在它工作! – 2014-10-01 22:40:27