Подтвердить что ты не робот

C более быстрый способ проверить, существует ли каталог

Я использую opendir для проверки наличия каталога. Проблема в том, что я использую его в массивном цикле, и он раздувает баран, используемый моим приложением.

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

4b9b3361

Ответ 1

Вы можете позвонить mkdir(). Если каталог не существует, он будет создан и будет возвращен 0. Если каталог существует, то возвращается -1 и errno будет установлено значение EEXIST.

Ответ 2

Рассмотрим использование stat. S_ISDIR(s.st_mode) расскажет вам, является ли это каталогом.

Пример:

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

...
struct stat s;
int err = stat("/path/to/possible_dir", &s);
if(-1 == err) {
    if(ENOENT == errno) {
        /* does not exist */
    } else {
        perror("stat");
        exit(1);
    }
} else {
    if(S_ISDIR(s.st_mode)) {
        /* it a dir */
    } else {
        /* exists but is no dir */
    }
}
...

Ответ 3

Я предпочитаю использовать access()

if (0 != access("/path/to/possible_dir/", F_OK)) {
  if (ENOENT == errno) {
     // does not exist
  }
  if (ENOTDIR == errno) {
     // not a directory
  }
}

Если вы гарантируете завершение / в имени каталога, это отлично работает.

Ответ 4

Я бы использовал stat(), если он доступен.

Ответ 5

Похоже, у вас утечка памяти. Вызов opendir не должен завышать ОЗУ вашего приложения, если вы помните, что всегда вызываете closedir после успешного открытия каталога. Кроме того, убедитесь, что вы освобождаете любые буферы, которые вы выделили, для вычисления имени каталога.