2013-08-01 4 views
0

В Linux open(filename, O_RDONLY) представляется успешным, если задано имя каталога вместо обычного файла (хотя последующие вызовы read() выглядят неудачными, что нужно только ожидать).Открыть файл, если не каталог

Что лучше всего проверить, если вы пытаетесь открыть или только что открыли каталог, для того, чтобы с ошибкой «oops, wrong filename» вместо «panic», у нас есть файл, но read isn ' t работает?

ответ

6

Вызов fstat() на дескриптор файла и проверьте режим файла:

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

// ... 

int fd = open(filename, O_RDONLY) 
if (fd == -1) { 
    // open() failed. 
} 
struct stat buf; 
if (fstat(fd, &buf) != 0) { 
    // fstat() failed. 
} 
if (S_ISDIR(buf.st_mode)) { 
    // It's a directory. 
} 

Это все переносимый код POSIX.

Обратите внимание, что вы можете использовать stat() на filename перед вызовом open(). Но это может привести к изменению файла файла между вызовами stat() и open(), что означает, что вы откроете() другой файл, а затем тот, который вы просмотрели с помощью stat(). Использование fstat() обеспечивает устойчивость к этому, поскольку файловые дескрипторы будут по-прежнему указывать на правильный файл, даже если он будет удален.

+0

@ugoren Вот почему я не использовал stat(). Но стоит упомянуть об этом. –