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(&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()