我在C中有以下代码:
DIR *mydir = opendir("/");
struct dirent *entry = NULL;
while((entry = readdir(mydir)))
{
printf("%s\n", entry->d_name);
//printf("%i\n", entry->d_type);
}
closedir(mydir);
它可以正常工作并显示位置中的文件/文件夹。
但是,我想知道它是文件夹还是文件。我怎样才能做到这一点?我尝试使用d_type(正如你在代码中看到的那样)但没有成功。
答案 0 :(得分:3)
使用stat()
:
struct stat st;
stat("nodename", &st);
int isDirectory = S_ISDIR(st.st_mode);
答案 1 :(得分:1)
您应该使用stat()函数来获取统计结构。
struct stat s;
if( stat(path,&s) == 0 )
{
if( s.st_mode & S_IFDIR )
{
//it's a directory
}
else if( s.st_mode & S_IFREG )
{
//it's a file
}
else
{
//something else
}
}
else
{
//error
}
答案 2 :(得分:0)
您可以使用这样的内置宏:
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
DIR *mydir = opendir(/);
struct dirent *entry = NULL;
struct stat buf;
while((entry = readdir(mydir)))
{
printf("%s\n", entry->d_name);
if (stat(entry, &buf))
{
perror("stat");
exit(-1);
}
if ( S_ISDIR(buf.st_mode) )
{
printf("%s is a directory\n", entry);
}
if ( S_ISREG(buf.st_mode) )
{
printf("%s is a regular file\n", entry);
}
}
closedir(mydir);
return 0;
}
有关详细信息,请参阅shell中的man 2 stat
。
答案 3 :(得分:0)
这是系统特定的,如果不了解您的操作系统和可能的其他设置,我们无法给出完全可靠的答案。
实际上,d_type确实适用于至少某些系统。您的代码在RedHat Linux上提供了一个有用的答案,目录值为4,常规文件为8,其他文件类型为其他值。这是一个错误的修复,用引号括起名字/在opendir的调用中。