【问题标题】:Determine file/folder in C确定 C 中的文件/文件夹
【发布时间】:2012-12-13 21:43:37
【问题描述】:

我在 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(如您在代码中看到的那样)但没有成功。

【问题讨论】:

    标签: c file directory


    【解决方案1】:

    使用stat():

    struct stat st;
    stat("nodename", &st);
    int isDirectory = S_ISDIR(st.st_mode);
    

    【讨论】:

      【解决方案2】:

      你应该使用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
      }
      

      【讨论】:

        【解决方案3】:

        您可以像这样使用内置宏:

        #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 以了解更多信息。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-01
            • 2015-05-09
            • 2019-06-23
            • 1970-01-01
            • 2014-02-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多