其他分享
首页 > 其他分享> > c – 带有struct dirent的sys / stat S_ISDIR(m)

c – 带有struct dirent的sys / stat S_ISDIR(m)

作者:互联网

我想检查文件是目录,链接还是仅仅是常规文件.我遍历目录并将每个文件保存为struct dirent *.我尝试将d_ino传递给S_ISDIR(m),S_ISLINK(m)或S_ISREG(m),无论文件如何,我都不会得到肯定的结果.所以我的问题是:如何在struct dirent中使用S_ISDIR(m)?

解决方法:

使用readdir(3)读取目录时,文件类型存储在您收到的每个struct dirent的d_type成员变量中,而不是d_ino成员中.您很少会关心inode编号.

但是,并非所有实现都具有d_type成员的有效数据,因此您可能需要在每个文件上调用stat(3)lstat(3)来确定其文件类型(如果您对符号链接感兴趣,请使用lstat,如果您对符号链接感兴趣,请使用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-3,systems-programming,c
来源: https://codeday.me/bug/20190729/1573412.html