C rename() FileNotFound 虽然文件存在
C rename() FileNotFound although file exists
我正在递归遍历目录以重命名文件。我在这里使用了一些正则表达式以及 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(®ex, pattern, 0);
if (regErr) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
// Execute regular expression
regErr = regexec(®ex, 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(®ex);
}
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()
我正在递归遍历目录以重命名文件。我在这里使用了一些正则表达式以及 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(®ex, pattern, 0);
if (regErr) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
// Execute regular expression
regErr = regexec(®ex, 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(®ex);
}
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()