Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 列出目录内容,如Unix';查找';命令_C_Unix_Directory_Find Util - Fatal编程技术网

C 列出目录内容,如Unix';查找';命令

C 列出目录内容,如Unix';查找';命令,c,unix,directory,find-util,C,Unix,Directory,Find Util,在Unix“find”实用程序的修改/更简单版本上工作,当我打印文件时,我的格式已关闭 运行: ./a.out mydir -print 输出应与find类似,如下所示: mydir mydir/innerDir mydir/innerDir/innerFile mydir/testFile mydir/innerDir innerFile/testFile 但是,我的输出如下: mydir mydir/innerDir mydir/innerDir/innerFile mydir/tes

在Unix“find”实用程序的修改/更简单版本上工作,当我打印文件时,我的格式已关闭

运行:

./a.out mydir -print
输出应与find类似,如下所示:

mydir
mydir/innerDir
mydir/innerDir/innerFile
mydir/testFile
mydir/innerDir
innerFile/testFile
但是,我的输出如下:

mydir
mydir/innerDir
mydir/innerDir/innerFile
mydir/testFile
mydir/innerDir
innerFile/testFile
这是我拥有的遍历目录内容的函数:

void printdir(char *dir, int depth) {
   DIR *dp;
   struct dirent *entry;
   struct stat statbuf;
   int spaces = depth * 4;
   char *path;

   if((dp = opendir(dir)) == NULL) {
      fprintf(stderr, "Error! Unable to open: %s\n", dir);
      exit(EXIT_FAILURE);
   }

   chdir(dir);
   while((entry = readdir(dp)) != NULL) {
      lstat(entry->d_name, & statbuf);
      if(S_ISDIR(statbuf.st_mode)) {
         if(strcasecmp(".", entry->d_name) == 0 ||
            strcasecmp("..", entry->d_name) == 0)
            continue;
         path = malloc(strlen(dir) + strlen(entry->d_name) + 2);
         strcpy(path, dir);
         strcat(path, "/");
         strcat(path, entry->d_name);
   //         printf("%*s|-- %s/\n", spaces, "", entry->d_name);
        printf("%s\n", path);
        printdir(entry->d_name, depth + 1);
      }
      else
   //         printf("%*s|-- %s\n", spaces, "", entry->d_name);
         printf("%s/", entry->d_name);
   }
   chdir("..");
   closedir(dp);
}

上面的注释行打印出与Unix“tree”实用程序类似的输出。关于如何修改打印以获得上面列出的“查找”输出的任何帮助。谢谢大家!

递归调用中的参数不正确,请发送完整路径:

printdir(path, depth + 1);
printf("%s/%s\n", dir, entry->d_name);
然后,对于非目录项,也打印完整路径:

printdir(path, depth + 1);
printf("%s/%s\n", dir, entry->d_name);
----编辑----

生成完整路径时,删除对
chdir
的所有调用

----编辑-2----

lstat
未在正确路径上调用,请修改为:

 while((entry = readdir(dp)) != NULL) {
     path = malloc(strlen(dir) + strlen(entry->d_name) + 2);
     strcpy(path, dir);
     strcat(path, "/");
     strcat(path, entry->d_name);
     lstat(path, & statbuf);

无需将
strcasecmp
一起使用-它的表示形式不会随大小写而改变。你是对的,我会改变它。不清楚你在问什么。总之,有两件事-最后一次打印甚至没有添加换行符(它应该,现在它使错误变得不那么明显),并检查你正在递归的字符串(您不应该使用完整路径而不是最后一个组件递归吗);然后您会注意到,您根本不需要
chdir
…在我将递归使用的字符串从最后一个组件更改为完整路径后,我打印了一个无法打开目录的错误,因为连接的字符串路径未被视为目录的名称。(也就是说,myDir/innerDir不是目录的名称,它应该是我遍历的innerDir。在我这样做之后,它会打印myDir/innerDir,然后在函数顶部打印错误。我删除了对chdir的两个调用,然后它会打印到遇到文件的位置,然后(显然)表示无法打开。但它不应该跳到下一个条目吗?现在它在遇到文件时打印错误。作为后续问题,我将如何使用strcasecmp按字典顺序对输出进行排序?读取给定目录的所有条目,对它们进行排序,然后执行您的技巧(打印/递归)。