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

Проверка наличия каталога в Unix (системный вызов)

Я не могу найти решение своей проблемы в Интернете.

Я хотел бы вызвать функцию в Unix, передать путь к каталогу и узнать, существует ли она. opendir() возвращает ошибку, если каталог не существует, но моя цель - не открывать, проверить ошибку, закрыть ее, если нет ошибки, а просто проверить, является ли файл каталогом или нет.

Есть ли удобный способ сделать это, пожалуйста?

4b9b3361

Ответ 1

В системах POSIX есть две релевантные функции: stat() и lstat(). Они используются, чтобы выяснить, относится ли путь к фактическому объекту, к которому у вас есть разрешение на доступ, и если да, возвращаемые данные указывают вам, какой тип объекта он имеет. Разница между stat() и lstat() заключается в том, что если имя, которое вы даете, является символической ссылкой, stat() следует символической ссылке (или ссылкам, если они связаны друг с другом), и отчеты об объекте в конце цепочки ссылки, тогда как lstat() сообщает о самой символической ссылке.

#include <sys/stat.h>

struct stat sb;

if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode))
{
    ...it is a directory...
}

Если функция указывает, что она была успешной, вы используете макрос S_ISDIR() из <sys/stat.h>, чтобы определить, действительно ли файл является каталогом.

Вы также можете проверить другие типы файлов, используя другие макросы S_IS*:

  • S_ISDIR — каталог
  • S_ISREG — обычный файл
  • S_ISCHR — символьное устройство
  • S_ISBLK — блочное устройство
  • S_ISFIFO — FIFO
  • S_ISLNK — символическая ссылка
  • S_ISSOCK — Гнездо

(Некоторые системы также предоставляют несколько других типов файлов; S_ISDOOR доступен, например, в Solaris.)

Ответ 2

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

EDIT:

Если возвращаемое значение равно 0, вам потребуется дополнительная проверка, чтобы убедиться, что аргумент фактически является каталогом, а не файлом/файлом/символом/char специальным файлом /blk специальным файлом/файлом FIFO. Вы можете использовать поле st_mode stat structure для этого.

Ответ 3

Вы можете использовать test -d

Ответ 4

Если вы говорите о оболочке, там есть хороший ответ . Чтобы подытожить этот ответ:

if [ -d "$DIRECTORY" ]; then
    # Control will enter here if $DIRECTORY exists
fi

Если вы говорите изнутри программы C, вы можете использовать stat():

{
    struct stat st;
    if(stat("/tmp",&st) == 0)
        printf(" /tmp is present\n");
}

Ответ 5

Если вам не нравится тип этого объекта файловой системы, access (name, F_OK) проверяет наличие чего-то с этим именем. Если вам нужно убедиться, что это каталог, используйте stat() и тип проверки с помощью макроса S_ISDIR().

Ответ 6

Протестировано и работает нормально:

int file_exist (char *filename)
{
    char s[200];
    sprintf(s, "test -e %s", filename);
    if (system(s) == 0){
        return 1;
    }else{
        return 0;
    }
}

Ответ 7

Я думаю, что функция stat может делать то, что вы хотите (я не тестирую ее для каталогов). В С++ вы также можете использовать библиотеку boost:: filesystem.