检查文件是否是目录

时间:2015-08-18 10:22:23

标签: c ls

程序:

#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/stat.h>
int main(int argc, char *argv[])
{
    DIR *dp;
    struct dirent *dirp;
    struct stat stbuf;
    if (argc != 2)
        printf("usage: ls directory_name\n");

    if ((dp = opendir(argv[1])) == NULL)
        printf("can’t open %s", argv[1]);

    while ((dirp = readdir(dp)) != NULL){
        stat(dirp->d_name,&stbuf);
        if(S_ISDIR(stbuf.st_mode)){
            printf("Directory: ");
        }
        printf("%s\n",dirp->d_name);
    }

    closedir(dp);
    exit(0);
}

输出:

$ ./a.out test/
dir3
d
c
Directory: .
Directory: a
Directory: ..
Directory: dir4
Directory: dir2
Directory: dir0
Directory: b
Directory: e
Directory: dir1
$

以下是目录&#34; test&#34;的文件列表。包含。

$ ls -F test/
a  b  c  d  dir0/  dir1/  dir2/  dir3/  dir4/  e
$ 

预期的输出是,如果文件是目录,则输出将是&#34;目录:dir1 /&#34;。否则只有文件名。 但是,该计划的产出并不像预期的那样。该程序是否包含任何错误?有没有让我知道。

提前致谢...

1 个答案:

答案 0 :(得分:2)

让我们把它分解成几步:

  1. 您从某个目录启动程序。该目录将成为进程当前工作目录(CWD)。

  2. 您在目录opendir上拨打test。这实际上是CWD中的目录test

  3. 您致电readdir以获取目录中的第一个条目。

  4. 第一个条目是.目录,它是当前目录的缩写,所有目录都有。

  5. 您使用stat致电.,这意味着您在CWD上致电stat。它当然是成功的,stat用CWD的所有细节填充结构。

  6. 下一次迭代,您将获得条目a,并在该条目上调用stat。但是,由于CWD中没有astat调用失败。但是,您不会检查该内容,并使用上一个调用中填写的stat结构(来自stat的成功. }目录)。

  7. 等等......

    您需要告诉stat查找给定目录中的条目而不是CWD。这基本上可以通过两种方式完成:

    • 格式化字符串,以便在条目前加上您传递给opendir的目录。 E.g。

      char path[PATH_MAX];
      snprintf(path, sizeof(path), "%s/%s", argv[1] ,dirp->p_name);
      if (stat(path, &stbuf) != -1)
      {
          // `stat` call succeeded, do something
      }
      
    • 调用opendir后,但在循环该目录之前,更改CWD:

      // Opendir call etc...
      
      chdir(argv[1]);
      
      // Loop using readdir etc.
      

    或者,从要检查的目录启动程序:

    $ cd test
    $ ../a.out .