检查目录。readdir返回的条目是目录,链接或文件。dent-> d_type没有显示类型

【字号: 日期:2024-01-24浏览:46作者:雯心
如何解决检查目录。readdir返回的条目是目录,链接或文件。dent-> d_type没有显示类型?

d_type是一项速度优化lstat(2),可在支持时节省通话费用。

正如readdir(3)手册页所指出的那样,并非所有文件系统都在该d_type字段中返回真实信息(通常是因为读取索引节点需要花费大量的磁盘查找工作,如果不使用XFS,情况就是这样mkfs.xfs-n ftype=1(-mcrc=1即(尚未设置为默认值)。始终设置的文件系统DT_UNKNowN在现实生活中很常见,并不是您可以忽略的东西。XFS并不是唯一的例子。

如果仅使用文件名不足以决定它没意思,您将始终需要使用iflstat(2)的代码d_type==DT_UNKNowN。(对于某些调用程序(例如find-name或扩展glob这样的调用程序),就是这种情况*.c,这就是为什么readdir如果需要额外的磁盘读取,也不会产生填充它的开销。)

Linuxgetdents(2)手册页上有一个示例程序,可以完成您要执行的操作,其中包括一个链接的三元运算符块,用于将d_type字段解码为文本字符串。(至于其他的答案指出,你的错误是打印出来作为一个字符,而不是它比较对DT_REG,DT_DIR等等)

无论如何,其他答案大多涵盖了所有内容,但是却错过了关键的细节,在这种情况下(Linux上的0 存储在以前的填充字节中,直到Linux 2.6.4),您 。d_type == DT_UNKNowN``d_type

为了便于移植,您的代码需要检查是否有struct dirent一个d_type字段(如果使用了它),否则您的代码 在GNU和BSD系统之外进行 。(请参阅readdir(3))

解决方法

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

输出应如下所示:

<< ./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 bytesn',(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_name);/* if (!stat(dent->d_name,&info)) { printf('%u bytesn',(unsigned int)info.st_size); }*/ } } while (dent); closedir(dirp); } return 0;}

由于某种原因dent->d_type未显示文件类型。我不太确定该怎么办,有什么建议吗?

相关文章: