如何使用C中的dirent标头扫描文件夹中的文本

时间:2016-05-15 10:00:29

标签: c dirent.h

我需要找到一种扫描文件夹的方法 - 例如-C:\ Users \ User \ Documents \ HW)并检查是否有一些我从用户那里得到的文字。我需要返回哪些文件具有完全相同的文本。我之前从未使用过dirent.h而且我不知道如何使用它;

1 个答案:

答案 0 :(得分:0)

您定义了自己的error函数来处理错误:

// Standard error function
void fatal_error(const char* message) {

  perror(message);
  exit(1);
}

遍历功能基本上是stat当前文件,如果该文件是目录,我们将进入该目录。在目录本身非常重要的是检查当前目录是否。或..因为这可能导致不定式循环。

void traverse(const char *pathName){

  /* Fetching file info */
  struct stat buffer;
  if(stat(pathName, &buffer) == -1)
    fatalError("Stat error\n");

  /* Check if current file is regular, if it is regular, this is where you 
     will see if your files are identical. Figure out way to do this! I'm 
     leaving this part for you. 
  */

  /* However, If it is directory */
  if((buffer.st_mode & S_IFMT) == S_IFDIR){

    /* We are opening directory */
    DIR *directory = opendir(pathName);
    if(directory == NULL)
      fatalError("Opening directory error\n");

    /* Reading every entry from directory */
    struct dirent *entry;
    char *newPath = NULL;
    while((entry = readdir(directory)) != NULL){

      /* If file name is not . or .. */
      if(strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){

        /* Reallocating space for new path */
        char *tmp = realloc(newPath, strlen(pathName) + strlen(entry->d_name) + 2);
        if(tmp == NULL)
          fatalError("Realloc error\n");
        newPath = tmp;

        /* Creating new path as: old_path/file_name */
        strcpy(newPath, pathName);
        strcat(newPath, "/");
        strcat(newPath, entry->d_name);

        /* Recursive function call */
        traverse(newPath);
      }
    }
    /* Since we always reallocate space, this is one memory location, so we free that memory*/
    free(newPath);

    if(closedir(directory) == -1)
      fatalError("Closing directory error\n");
  }

}

您也可以使用chdir()功能执行此操作,这可能更简单,但我想以这种方式向您展示,因为它非常令人毛骨悚然。但是,遍历文件夹/文件层次结构的最简单方法是NFTW函数。请务必在man页中查看。

如果您有任何其他问题,请随时提出。