Как различить указатель файла, указывающий на файл или каталог?

Когда я делаю:

FILE * fp = fopen("filename", "r");`  

Как я могу узнать, что указатель файла fp указывает на файл или каталог? Потому что я думаю, что в обоих случаях fp не будет нулевым. Что я могу сделать?

Среда является UNIX.

3 ответа

Решение

Я нашел это поблизости:

#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>

int main (int argc, char *argv[]) {
    int status;
    struct stat st_buf;

    status = stat ("your path", &st_buf);
    if (status != 0) {
        printf ("Error, errno = %d\n", errno);
        return 1;
    }

    // Tell us what it is then exit.

    if (S_ISREG (st_buf.st_mode)) {
        printf ("%s is a regular file.\n", argv[1]);
    }
    if (S_ISDIR (st_buf.st_mode)) {
        printf ("%s is a directory.\n", argv[1]);
    }
}

Вы могли бы использовать fileno() получить дескриптор файла для уже открытого файла, а затем использовать fstat() на дескриптор файла, чтобы иметь struct stat вернулся.

Это член st_mode несет информацию о файле.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
  FILE * pf = fopen("filename", "r");
  if (NULL == pf)
  {
    perror("fopen() failed");
    exit(1);
  }

  {
    int fd = fileno(pf);
    struct stat ss = {0};

    if (-1 == fstat(fd, &ss))
    {
      perror("fstat() failed");
      exit(1);
    }

    if (S_ISREG (ss.st_mode))  
    {
      printf ("Is's a file.\n");
    }
    else if (S_ISDIR (ss.st_mode)) 
    {
     printf ("It's a directory.\n");
    }
  }

  return 0;
}

В Windows вызовите GetFileAttributes и проверьте наличие атрибута FILE_ATTRIBUTE_DIRECTORY.

Проверьте это и это.

Другие вопросы по тегам