Как проверить, существует ли каталог в C - PullRequest
2 голосов
/ 17 января 2010

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

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

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

Спасибо

-Aaron

Ответы [ 4 ]

6 голосов
/ 17 января 2010
struct stat st;
if(stat("/directory",&st) == 0) 
        printf(" /directory is present\n");
6 голосов
/ 17 января 2010

Имена файлов сами по себе не несут никакой информации о том, существуют они или нет или являются ли они каталогом с ними - кто-то может изменить его из-под вас.То, что вы хотите сделать, это запустить библиотечный вызов, а именно 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-страницу для получения дополнительной информации.

4 голосов
/ 17 января 2010

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

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

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

   ...

  DIR  *dip;
  if ((dip = opendir(argv[1])) == NULL)
  {         
     printf("not a directory");
  }
  else closedir(dip);
0 голосов
/ 17 января 2010

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

...