#c #unix #filesystems #posix
#c #unix #файловые системы #posix
Вопрос:
У меня возникли проблемы с S_ISXXX(m)
макросами из sys/stat.h
В частности, почти все сообщается как каталог. Только обычные файлы корректно отображаются как обычные файлы, ссылки, устройства, fifos, все, похоже, отображаются как каталоги.
Я что-то упускаю, или это вообще ошибка?
Вот код, он должен быть довольно простым (извините за чешский текст, но вы должны уловить идею, даже не понимая этого 🙂
int listdir(const char *path)
{
struct dirent *polozka;
DIR *dir;
dir = opendir(path);
if (dir == NULL)
{
perror("nepovedlo se otevrit adresar");
return -1;
}
while((polozka = readdir(dir)))
{
struct stat info;
lstat(polozka->d_name,amp;info);
puts(polozka->d_name);
if (S_ISREG(info.st_mode))
puts("tObycejny soubor");
if (S_ISDIR(info.st_mode))
puts("tAdresar");
if (S_ISCHR(info.st_mode))
puts("tZnakove zarizeni");
if (S_ISBLK(info.st_mode))
puts("tBlokove zarizeni");
if (S_ISFIFO(info.st_mode))
puts("tPojemenovana roura");
if (S_ISLNK(info.st_mode))
puts("tSymbolicky link");
if (S_ISSOCK(info.st_mode))
puts("tSocket");
}
closedir(dir);
return 0;
}
Комментарии:
1. Я не думаю, что они глючат — покажите свой код!
Ответ №1:
Вы не проверяете, lstat
действительно ли сработало, и я предполагаю, что это сбой.
polozka->d_name
содержит только имя файла без пути. Если path
в вашем примере используется что-то другое, кроме текущего каталога, большинство lstat
вызовов завершатся неудачей, оставаясь info
в неопределенном состоянии.
Комментарии:
1. Да, это действительно кажется таким тривиальным 🙂 Спасибо