c++ - 系统/统计 S_ISDIR(m) 与结构 dirent

标签 c++ c systems-programming

我想检查文件是目录、链接还是普通文件。我遍历目录并将每个文件保存为 struct dirent *。我尝试将 d_ino 传递给 S_ISDIR(m)S_ISLINK(m)S_ISREG(m) 并且无论文件如何,我都不会得到积极的结果。所以我的问题是:如何将 S_ISDIR(m)struct dirent 一起使用?

最佳答案

当您使用 readdir(3) 读取目录时,文件类型存储在您收到的每个 struct direntd_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/

相关文章:

c - 为什么堆栈上溢/下溢不会触发运行时错误?

filesystems - 如何以编程方式真正清理删除文件?

C++ 优雅关机最佳实践

c - 内存文件的文件路径

c - 函数执行后结构体数组中的值丢失

linux - CHMOD 与 UMASK - Linux 文件权限

将float转换为c中的字符串

c++ - 我的计算器程序 C++ 出现错误

C++ getline 使用逗号作为分隔符的多个变量类型

c++ - 枚举信号参数