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