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

Как проверить, существует ли каталог?

Как проверить, существует ли каталог в Linux в C?

4b9b3361

Ответ 1

Вы можете использовать opendir() и проверить, если ENOENT == errno в случае ошибки:

#include <dirent.h>
#include <errno.h>

DIR* dir = opendir("mydir");
if (dir) {
    /* Directory exists. */
    closedir(dir);
} else if (ENOENT == errno) {
    /* Directory does not exist. */
} else {
    /* opendir() failed for some other reason. */
}

Ответ 2

Используйте следующий код, чтобы проверить, существует ли папка. Он работает на платформах Windows и Linux.

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    const char* folder;
    //folder = "C:\\Users\\SaMaN\\Desktop\\Ppln";
    folder = "/tmp";
    struct stat sb;

    if (stat(folder, &sb) == 0 && S_ISDIR(sb.st_mode)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
}

Ответ 3

Вы можете использовать stat() и передать ему адрес struct stat, а затем проверить его член st_mode для установки S_IFDIR.

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

...

char d[] = "mydir";

struct stat s = {0};

if (!stat(d, &s))
  printf("'%s' is %sa directory.\n", d, (s.st_mode & S_IFDIR)  : "" ? "not ");
  // (s.st_mode & S_IFDIR) can be replaced with S_ISDIR(s.st_mode)
else
  perror("stat()");

Ответ 4

Лучший способ, вероятно, пытается открыть его, используя только opendir(), например.

Обратите внимание, что всегда лучше попробовать использовать ресурс файловой системы и обрабатывать любые ошибки, возникающие из-за того, что они не существуют, а не просто проверять, а затем пытаться. В последнем подходе есть очевидное состояние гонки.

Ответ 5

Согласно статистике man (2), вы можете использовать макрос S_ISDIR в поле st_mode:

bool isdir = S_ISDIR(st.st_mode);

Примечание: я бы порекомендовал использовать Boost и/или Qt4, чтобы упростить кроссплатформенную поддержку, если ваша программа может быть жизнеспособной в других ОС.

Ответ 6

Вы также можете использовать access в сочетании с opendir чтобы определить, существует ли каталог, и если имя существует, но не является каталогом. Например:

/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (const char *d)
{
    DIR *dirptr;

    if (access ( d, F_OK ) != -1 ) {
        // file exists
        if ((dirptr = opendir (d)) != NULL) {
            closedir (dirptr);
        } else {
            return -2; /* d exists, but not dir */
        }
    } else {
        return -1;     /* d does not exist */
    }

    return 1;
}

Ответ 7

Я согласен с тем, что следующий заголовок является одним из лучших решений:

#include <stdio.h>
#include <sys/stat.h>

Ответ 8

Еще два способа, возможно, менее правильные - использовать. Первый, используя только стандартные библиотеки и только для файлов:

FILE *f;
f = fopen("file", "r")
if(!f)
   printf("there is no file there");

Это может работать на всех ОС.

Или еще и для dirs, используя системный вызов с системой(). Это худший вариант, но дает вам другой путь. Для кого-то может быть полезно.