C более быстрый способ проверить, существует ли каталог - PullRequest
20 голосов
/ 16 февраля 2012

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

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

Ответы [ 5 ]

42 голосов
/ 16 февраля 2012

Рассмотрите возможность использования 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's a dir */
    } else {
        /* exists but is no dir */
    }
}
...
18 голосов
/ 16 февраля 2012

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

17 голосов
/ 07 марта 2013

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

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

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

2 голосов
/ 16 февраля 2012

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

0 голосов
/ 16 февраля 2012

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

...