rename()仅适用于运行程序的目录?

时间:2014-07-14 19:30:20

标签: c rename

我正在尝试重命名用户指定目录中的一堆文件,但它似乎只在用户指定运行程序的目录时才起作用。例如,从命令行运行时:

./a.out . "NewName.txt"可以使用,而

./a.out .. "NewName.txt"无效。是否有一个原因?顺便说一句,这是在Linux上。

int main(int argc, char** argv){
  char* dirpath = argv[1];
  char* newName = argv[2];

  DIR *d;
  struct dirent *dir;
  d = opendir(dirpath);
  if (d){
     while ((dir = readdir(d)) != NULL){
        char* filename = dir->d_name;
        if (rename(filename,newName) == 0){
           printf("Renaming %s -> %s\n",filename,newName);               
        } else {
           printf("Could not rename %s\n",filename);
        }
     }
   }
   closedir(d);
}

我也尝试过(从桌面外部运行程序时):

 if (rename("~/Desktop/test.txt","~/Desktop/test2.txt") == 0){
    printf("Renaming %s -> %s\n",filename,newName);               
 } else {
    printf("Could not rename %s\n",filename);
 }

但它仍然失败。

3 个答案:

答案 0 :(得分:2)

readdir()正在从其他目录中读取文件名时,您程序的当前目录仍在不同的位置。除非您在源文件名前添加目录路径(以及目标文件名),否则您通常会尝试重命名当前目录中不存在的文件。

在伪代码中:

dir = opendir(remote_directory)
foreach name from dir
    rename "remote_directory/name" to "remote_directory/othername"
end for

请注意,如果' remote_directory'碰巧是.,当前目录;你不需要特殊情况下的代码。

答案 1 :(得分:1)

来自文档:

  

旧参数指向要重命名的文件的路径名。       新参数指向文件的新路径名。       如果新参数未解析为a的现有目录条目       类型目录的文件和新参数至少包含一个非<slash>       字符,并以所有符号后的一个或多个尾随<slash>个字符结束       链接已处理,rename()将失败

当您使用&#39;以外的任何路径时,您似乎并未引用现有元素。这可能是它失败的原因。

检查特定的errno值以查看原因。

答案 2 :(得分:1)

我认为你的主要问题是来自readdir的结果只是文件名。它不包括目录。您需要将dir->d_name中的目录名称和文件名粘贴到程序中。