1

我在 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 (如您在代码中所见)但没有成功。

4

4 回答 4

3

使用stat()

struct stat st;
stat("nodename", &st);
int isDirectory = S_ISDIR(st.st_mode);
于 2012-12-13T21:49:17.853 回答
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
}
于 2012-12-13T21:50:56.577 回答
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;
}

有关更多信息,请参阅man 2 statshell。

于 2012-12-13T21:52:17.763 回答
0

这是特定于系统的,如果不了解您的操作系统和可能的其他设置,我们无法给出完全可靠的答案。

d_type 实际上至少适用于某些系统。您的代码在 RedHat Linux 上给出了一个有用的答案,目录值为 4,常规文件为 8,其他文件类型为其他值。这是对拼写错误的修复,在对 opendir 的调用中用引号将名称 / 括起来。

于 2012-12-13T21:54:13.107 回答