我正在尝试重命名用户指定目录中的一堆文件,但它似乎只在用户指定运行程序的目录时才起作用。例如,从命令行运行时:
./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);
}
但它仍然失败。
答案 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
中的目录名称和文件名粘贴到程序中。