C rename()FileNotFound虽然文件存在

时间:2015-08-02 03:38:56

标签: c regex recursion file-rename

我正在通过目录进行递归遍历来重命名文件。我在这里使用了一些正则表达式以及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;
}

1 个答案:

答案 0 :(得分:1)

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

一切都在没有更改目录的情况下运行,它只是按路径名走树。

重命名无法找到该文件,因为它不在当前目录中。 并且你不会告诉replaceFileName文件实际在哪个目录。

可能您希望使用chdir()进入您找到的目录,然后以递归方式退出。

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