程序:
#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;。否则只有文件名。 但是,该计划的产出并不像预期的那样。该程序是否包含任何错误?有没有让我知道。
提前致谢...
答案 0 :(得分:2)
让我们把它分解成几步:
您从某个目录启动程序。该目录将成为进程当前工作目录(CWD)。
您在目录opendir
上拨打test
。这实际上是CWD中的目录test
。
您致电readdir
以获取目录中的第一个条目。
第一个条目是.
目录,它是当前目录的缩写,所有目录都有。
您使用stat
致电.
,这意味着您在CWD上致电stat
。它当然是成功的,stat
用CWD的所有细节填充结构。
下一次迭代,您将获得条目a
,并在该条目上调用stat
。但是,由于CWD中没有a
,stat
调用失败。但是,您不会检查该内容,并使用上一个调用中填写的stat
结构(来自stat
的成功.
}目录)。
等等......
您需要告诉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 .