Есть ли простой способ узнать, открыл ли файловый поток каталог вместо файла? - PullRequest
0 голосов
/ 28 ноября 2009

Я создаю HTTP-сервер, и когда я получаю путь к файлу, который они запрашивают, я открываю его следующим образом:

returned_file = fopen(path, "r");

это (вопреки тому, что я думаю) будет успешным, даже если путь является каталогом. Есть ли простой способ проверить, является ли поток возвращаемого файла каталогом, а не файлом?

Ответы [ 4 ]

4 голосов
/ 28 ноября 2009

Прорабатывая другие ответы, вы можете вызвать 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");
    }
  }
4 голосов
/ 28 ноября 2009

вы можете использовать fstat в файловом дескрипторе, возвращаемом fopen.

Edit: Вот и пример программы:

#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 ;
}
0 голосов
/ 28 ноября 2009

Используйте stat () для имени файла перед его открытием или fstat () файловый дескриптор fileno (return_file).

0 голосов
/ 28 ноября 2009

Можете ли вы проверить, указывает ли путь к каталогу до , который вы вызываете fopen?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...