检查一个目录。 readdir返回的条目是一个目录,链接或文件

我正在制作一个在Linux shell中运行的程序,并接受一个参数(一个目录),并显示目录中的所有文件及其types。

输出应该是这样的:

<< ./Program testDirectory Dir directory1 lnk linkprogram.c reg file.txt 

如果没有参数,它使用当前目录。 这是我的代码:

 #include <stdio.h> #include <dirent.h> #include <sys/stat.h> int main(int argc, char *argv[]) { struct stat info; DIR *dirp; struct dirent* dent; //If no args if (argc == 1) { argv[1] = "."; dirp = opendir(argv[1]); // specify directory here: "." is the "current directory" do { dent = readdir(dirp); if (dent) { printf("%c ", dent->d_type); printf("%s \n", dent->d_name); /* if (!stat(dent->d_name, &info)) { //printf("%u bytes\n", (unsigned int)info.st_size); }*/ } } while (dent); closedir(dirp); } //If specified directory if (argc > 1) { dirp = opendir(argv[1]); // specify directory here: "." is the "current directory" do { dent = readdir(dirp); if (dent) { printf("%c ", dent->d_type); printf("%s \n", dent->d_name); /* if (!stat(dent->d_name, &info)) { printf("%u bytes\n", (unsigned int)info.st_size); }*/ } } while (dent); closedir(dirp); } return 0; } 

出于某种原因, dent->d_type不显示文件的types。 我真的不知道该怎么做,有什么build议吗?

Solutions Collecting From Web of "检查一个目录。 readdir返回的条目是一个目录,链接或文件"

d_type是在支持lstat(2)调用时保存的速度优化。

正如readdir (3)手册页指出的那样,并不是所有的文件系统都会在d_type字段中返回真实的信息(通常是因为需要额外的磁盘寻道来读取inode,如果没有使用mkfs.xfs -n ftype=1 ,就像XFS一样mkfs.xfs -n ftype=1 (由-m crc=1暗示,这还不是默认的)。总是设置DT_UNKNOWN文件系统在现实生活中是很常见的,而不是你可以忽略的东西,XFS不是唯一的例子。

如果d_type==DT_UNKNOWN ,如果单独的文件名不足以决定它不感兴趣,你总是需要使用lstat (2)的代码。 (对于一些调用者来说就是这种情况,比如find -name或者扩展名为*.c ,这就是为什么readdir不需要额外读取磁盘就可以填充的空间)。

Linux getdents(2)手册页中有一个示例程序,它可以完成你想要做的事情,包括一个链接三元运算符块,用于将d_type字段解码为文本字符串。 (正如其他答案指出的那样,您的错误是将其打印出来作为一个字符,而不是将其与DT_REGDT_DIR等进行比较)

无论如何,其他的答案大多是覆盖的东西,但是错过了关键的细节,你需要一个回退的情况下,当d_type == DT_UNKNOWN (0在Linux上, d_type被存储在曾经是一个填充字节,直到Linux 2.6.4) 。

为了便于携带,你的代码需要检查struct dirent甚至有一个d_type字段,如果你使用它,或者你的代码甚至不会在GNU和BSD系统之外进行编译 。 (见readdir(3)


我编写了一个用readdir查找目录的例子,当d_type在编译时,DT_UNKNOWN和符号链接时不可用时,使用d_type作为stat的后备。

返回结构中的d_type为该类型提供了一个数字。 您不能直接打印,因为使用的值在解释为ASCII时不可打印(例如,对于dirs是4,对于文件是4)。

你可以把它们打印成这样的数字:

 printf("%d ", dent->d_type) 

或者将它们与DT_DIR这样的常量进行比较,并DT_DIR构建一些有意义的输出,如char类型:

 if(dent->type == DT_DIR) type = 'd' 

打印d_type如下所示的整数:

 printf("%d ", dent->d_type); 

你会看到有意义的价值。