gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:15:49 27 4
gpt4 key购买 nike

我正在制作一个在 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 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 没有显示文件类型。我不太确定该怎么做,有什么建议吗?

最佳答案

d_type 是一种速度优化,可在支持时节省 lstat(2) 调用。

作为readdir(3) man page指出,并非所有文件系统都在 d_type 字段中返回真实信息(通常是因为需要额外的磁盘搜索来读取 inode,如果您不使用 ,XFS 就是这种情况mkfs.xfs -n ftype=1(由 -m crc=1 暗示,这还不是默认设置)。总是设置 DT_UNKNOWN 的文件系统在现实生活,而不是你可以忽略的东西。XFS 不是唯一的例子。

您始终需要能够回退到使用 lstat(2) 的代码如果 d_type==DT_UNKNOWN,如果文件名本身不足以决定它是无趣的。 (某些调用者就是这种情况,例如 find -name 或扩展 glob,例如 *.c,这就是为什么 readdir 不会产生如果需要额外的磁盘读取,则填充它的开销。)

Linux getdents(2)手册页有一个示例程序可以执行您正在尝试执行的操作,包括一个链式三元运算符 block ,用于将 d_type 字段解码为文本字符串。 (正如其他答案所指出的,您的错误是将其作为字符打印出来,而不是将其与 DT_REGDT_DIR 等进行比较)

无论如何,其他答案大多涵盖了一些内容,但遗漏了关键细节,即您需要回退 d_type == DT_UNKNOWN(Linux 上为 0。d_type 存储在以前的填充字节中,直到 Linux 2.6.4)。

为了便于移植,您的代码需要检查 struct dirent 甚至有一个 d_type 字段(如果您使用它),否则您的代码甚至不会在 GNU 和 BSD 系统之外编译。 (参见 readdir(3))


我为 finding directories with readdir 写了一个例子,当 d_type 在编译时不可用、为 DT_UNKNOWN 和符号链接(symbolic link)时,使用 d_type 回退到 stat

关于检查一个目录。 readdir 返回的条目是目录、链接或文件。 dent->d_type 没有显示类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958040/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com