我想检查文件是目录、链接还是普通文件。我遍历目录并将每个文件保存为 struct dirent *
。我尝试将 d_ino
传递给 S_ISDIR(m)
、S_ISLINK(m)
或 S_ISREG(m)
并且无论文件如何,我都不会得到积极的结果。所以我的问题是:如何将 S_ISDIR(m)
与 struct dirent
一起使用?
最佳答案
当您使用 readdir(3)
读取目录时,文件类型存储在您收到的每个 struct dirent
的 d_type
成员变量中,而不是 d_ino
成员。您很少会关心 inode 编号。
但是,并非所有实现都具有d_type
成员的有效数据,因此您可能需要调用stat(3)
。或 lstat(3)
在每个文件上确定其文件类型(如果您对符号链接(symbolic link)感兴趣,请使用 lstat
,如果您对符号链接(symbolic link)的目标感兴趣,请使用 stat
)和然后使用 S_IS***
宏检查 st_mode
成员。
典型的目录迭代可能如下所示:
// Error checking omitted for expository purposes
DIR *dir = opendir(dir_to_read);
struct dirent *entry;
while((entry = readdir(dir)) != NULL)
{
struct stat st;
char filename[512];
snprintf(filename, sizeof(filename), "%s/%s", dir_to_read, entry->d_name);
lstat(filename, &st);
if(S_ISDIR(st.st_mode))
{
// This directory entry is another directory
}
else if(S_ISLINK(st.st_mode))
{
// This entry is a symbolic link
}
else if(S_ISREG(st.st_mode))
{
// This entry is a regular file
}
// etc.
}
closedir(dir);
关于c++ - 系统/统计 S_ISDIR(m) 与结构 dirent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376056/