Проверка наличия каталога в Unix (системный вызов)
Я не могу найти решение своей проблемы в Интернете.
Я хотел бы вызвать функцию в Unix, передать путь к каталогу и узнать, существует ли она. opendir()
возвращает ошибку, если каталог не существует, но моя цель - не открывать, проверить ошибку, закрыть ее, если нет ошибки, а просто проверить, является ли файл каталогом или нет.
Есть ли удобный способ сделать это, пожалуйста?
Ответы
Ответ 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.