2010-02-04 2 views
13

В настоящее время у меня есть некоторый код, как (конденсируется и удаляется кучу ошибок проверки):Кроссплатформенный способ проверки, является ли файл каталогом

dp = readdir(dir); 
if (dp->d_type == DT_DIR) { 
} 

Это работает гладко на моей машине Linux. Однако на другой машине (выглядит как SunOS, СПАРК):

SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10 

я получаю следующую ошибку во время компиляции:

error: structure has no member named `d_type' 
error: `DT_DIR' undeclared (first use in this function) 

Я думал, что заголовок dirent.h был кроссплатформенная (для машин POSIX). Какие-либо предложения.

+0

Когда я вижу кросс-платформу, я склонен предположить, что вы имеете в виду Windows и, возможно, OS/2. :-) Ответ на просто Posix прост, и кто-то уже его дал. – Omnifarious

ответ

18

Ref http://www.nexenta.org/os/Porting_Codefixes:

Определение Dirent структуры в солярисе не содержит d_type поля. Вы должны были бы сделать следующие изменения

if (de->d_type == DT_DIR) 
{ 
    return 0; 
} 

изменения в

struct stat s; /*include sys/stat.h if necessary */ 
.. 
.. 
stat(de->d_name, &s); 
if (s.st_mode & S_IFDIR) 
{ 
    return 0; 
} 

Поскольку stat также POSIX стандарта должно быть более кросс-платформенным. Но вы можете использовать if ((s.st_mode & S_IFMT) == S_IFDIR), чтобы следовать стандарту.

+9

На самом деле POSIX определяет макрос для этого: 'if (S_ISDIR (s.st_mode)). Также, конечно, вы должны проверить, что 'stat()' будет успешным первым. – mark4o

+0

Обратите внимание, что fstatat (2) может быть более предпочтительным по сравнению с stat (2), поскольку 'de-> d_name' относится к открытому каталогу. – Igor

Смежные вопросы