确定C中的文件/文件夹

时间:2012-12-13 21:43:37

标签: c file directory

我在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 个答案:

答案 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的调用中。