有没有一种简单的方法来判断文件流是否已打开目录而不是文件?

时间:2009-11-27 23:13:56

标签: c++ file directory

我正在创建一个HTTP服务器,当我得到他们请求的文件的路径时,我用以下内容打开它:

returned_file = fopen(path, "r");
即使路径是目录,这(与我的想法相反)也会成功。有没有一种简单的方法来检查returned_file流是否是目录而不是文件?

4 个答案:

答案 0 :(得分:4)

你可以在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 ;
}

答案 1 :(得分:4)

详细说明其他答案,您可以在返回的文件描述符上调用fstat,并检查st_modeS_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");
    }
  }

答案 2 :(得分:0)

您可以在调用fopen之前检查路径是否指向目录吗?

答案 3 :(得分:0)

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