Как различить указатель файла, указывающий на файл или каталог?
Когда я делаю:
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.