【问题标题】:Is there an easy way to tell if a File stream has opened a directory instead of a file?有没有一种简单的方法来判断文件流是否打开了目录而不是文件?
【发布时间】:2009-11-27 23:13:56
【问题描述】:

我正在制作一个 HTTP 服务器,当我获得他们请求的文件的路径时,我使用以下命令打开它:

returned_file = fopen(path, "r");

即使路径是目录,这(与我的想法相反)也会成功。有没有一种简单的方法可以检查返回的文件流是目录而不是文件?

【问题讨论】:

    标签: c++ file directory


    【解决方案1】:

    您可以在 fopen 返回的文件描述符上使用 fstat。

    编辑: 这是示例程序:

    #include <sys/stat.h>
    #include <stdio.h>
    
    void printISDir( FILE* fp, char const * name ) {
      int fdes = fileno(fp) ;
      struct stat fileInfo ;
      fstat(fdes, &fileInfo ) ;
      if ( S_ISDIR(fileInfo.st_mode ) ) {
        printf("%s: I'm a dir!\n", name ) ;
      } else {
        printf("%s: I'm a file!\n", name ) ;
      }
    
    }
    
    int main( int argc, char** argv ) {
      char const * directoryName = "/etc" ;
      char const * fileName = "/etc/hosts" ;
    
      FILE* dirFp = fopen(directoryName, "r") ;
      FILE* fileFp = fopen(fileName, "r") ;
      printISDir( dirFp, directoryName ) ;
      printISDir( fileFp, fileName ) ;
      fclose(dirFp) ;
      fclose(fileFp) ;
    
      return 0 ;
    }
    

    【讨论】:

      【解决方案2】:

      详细说明其他答案,您可以在返回的文件描述符上调用 fstat 并检查 st_mode 中的 S_IFDIR 位。 S_ISDIR 辅助宏很有帮助:

        #include <sys/stat.h>
      

      ...

        FILE* f = fopen(path, "r");
      
        struct stat buf;
        if (fstat(fileno(f), &buf) == -1) {
          perror("fstat");
        } else {
          if (S_ISDIR(buf.st_mode)) {
            printf("is directory\n");
          } else {
            printf("not directory\n");
          }
        }
      

      【讨论】:

      • S_ISDIR(buf.st_mode) from 也可以使用
      【解决方案3】:

      您能否检查路径是否指向您调用 fopen之前的目录?

      【讨论】:

      • (也许这应该是一个评论。)
      • 当然可以,但这基本上就是我要问的,我该如何检查?
      • 也许我对此并不清楚,但我不能只通过查看'/'是否在末尾来判断它是否是目录来检查路径,因为它不是一个“/”的要求在最后是一个目录
      • 推荐的两个 fstat 之一是更好的选择。 (我想我太可可了,以至于我把一些香草 C 的东西放在一边……)
      【解决方案4】:

      在打开文件之前对文件名使用 stat(),或者使用 fstat() 文件描述符 fileno(returned_file)。

      【讨论】:

      • 我尝试使用stat,它返回一个struct stat,现在使用该结构我如何确定它是否是一个目录?
      • 不要使用 stat,使用 fstat。您总是需要在打开它之后进行检查,以避免在检查时它是一个文件但在您打开完成之前被删除并变成一个目录的竞争条件。
      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2011-06-17
      • 2011-09-16
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多