2010-01-17 3 views
2

Привет, ребята, я относительно не знаком с C, так что простите меня, если это глупый вопрос, но как я могу проверить, является ли FILE каталогом? У меня естьКак проверить, существует ли каталог в C

if (file == NULL) { 
    fprintf(stderr, "%s: No such file\n", argv[1]); 
    return 1; 
} 

и что проверки, если узел существует вообще, но я хочу знать, если это реж или файл. Я сделал некоторые погуглите, и я не могу найти ответ: \

Спасибо,

-Aaron

ответ

6

имен файлов сам не несут никакой информации о существуют ли они или нет, или они являются ли каталог с ними - кто-то может изменить его из-под вас. То, что вы хотите сделать, это запустить вызов библиотеки, а именно stat (2), который сообщает, если файл существует или нет, и что это такое. На странице руководства,

[ENOENT]   The named file does not exist. 

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

The status information word st_mode has the following bits: 
... 
#define  S_IFDIR 0040000 /* directory */ 

Для получения дополнительной информации, пожалуйста, просмотрите man-страницу.

+1

С вашего ответа в виду, я обнаружил S_ISDIR «макро» на странице линукс человека (в частности, не мужчина страницу OS X я проверял, хотя он работает на обоих), который использует st_mode. Я не знаю, это то, что вы имели в виду или нет, но это работает, так что это нормально.) –

+1

Макрос 'S_ISDIR' предпочтительнее, чем флаг' S_IFDIR', из-за некоторых тонких проблем, которые могут возникнуть с последними , – roguesys

4

использование opendir, чтобы попытаться открыть его в качестве каталога. Если это возвращает нулевой указатель это явно не каталог :)

Вот фрагмент вашего вопроса:

#include <stdio.h> 
    #include <dirent.h> 

    ... 

    DIR *dip; 
    if ((dip = opendir(argv[1])) == NULL) 
    {   
    printf("not a directory"); 
    } 
    else closedir(dip); 
0

Если вы используете * nix, stat().

6
struct stat st; 
if(stat("/directory",&st) == 0) 
     printf(" /directory is present\n");