gpt4 book ai didi

C rename() FileNotFound 尽管文件存在

转载 作者:行者123 更新时间:2023-11-30 15:18:06 25 4
gpt4 key购买 nike

我正在递归遍历目录来重命名文件。我在这里使用一些正则表达式以及 strstr() 来查找文件但是,当我的程序尝试重命名文件时,即使该文件在那里,也会抛出 FileNotFound 错误。我确实检查了文件权限,但没有遇到该错误。有人可以解释为什么这样做。

下面是我的代码。假设我有一堆名为 bar 的文件,我想将它们重命名为 foo (实际上应该是 bar, AbarBC, file.bar 到 foo, AfooBC, file.foo,但我现在只想关注这个):

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>

void replaceFileName(const char *pattern, const char *replace, char *fileName) {
regex_t regex;
int regErr, fileErr;
char buffer[100];

// Compile regular expression
regErr = regcomp(&regex, pattern, 0);
if (regErr) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}

// Execute regular expression
regErr = regexec(&regex, fileName, 0, NULL, 0);
if (!regErr) { // found match
printf("%s\n", fileName);
// rename file
char *newName = "foo";
// I didn't set newName = replace because of the further implementation
// I mentioned above

fileErr = rename(fileName, newName);
if (errno == EACCES) { // permission denied
fprintf(stderr, "Permission denied when reading: %s\n", fileName);
exit(1);
}
else { // other error
fprintf(stderr, "Error renaming file: %s\n", fileName);
fprintf(stderr, "%s\n", strerror(errno)); // THROWING ERROR HERE
exit(1);
}
}

regfree(&regex);
}

void recursiveWalk(const char *pattern, const char *replace, const char *pathName, int level) {
DIR *dir;
struct dirent *entry;

dir = opendir(pathName); // open directory
if (!dir) {
fprintf(stderr, "Could not open directory\n");
return;
}

if (!(entry = readdir(dir))) {
fprintf(stderr, "Could not read directory\n");
return;
}

do {
if (entry->d_type == DT_DIR) { // found subdirectory
char path[1024];

int len = snprintf(path, sizeof(path)-1, "%s/%s", pathName, entry->d_name); // get depth
path[len] = 0;

// skip hidden paths
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}

fprintf(sdtout, "%*s[%s]\n", level*2, "", entry->d_name);
recursiveWalk(pattern, replace, path, level + 1);
}
else { // files
fprintf(stdout, "%*s- %s\n", level*2, "", entry->d_name);
replaceFileName(pattern, replace, (char *)entry->d_name);
}
} while (entry = readdir(dir));

closedir(dir);
}

int main(int argn, char *argv[]) {
int level = 0;
recursiveWalk("bar", "foo", ".", level);

return 0;
}

最佳答案

你的步行实际上并没有去任何地方。

这一切都在不更改目录的情况下运行,它只是按路径名遍历树。

重命名找不到该文件,因为它不在当前目录中。并且您没有告诉 replaceFileName 文件实际位于哪个目录。

您可能想使用chdir()进入您找到的目录,然后递归地退出。

或者,您可以将目录名称粘贴到文件名的开头或单独将其传递给 replaceFileName()

关于C rename() FileNotFound 尽管文件存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com