Я знаю, что это годы спустя, но для потомков вы делали это неправильно:
@ alk был прав, поле st_mode содержит больше информации, например, тип файла, права доступа к файлу,etc
Чтобы извлечь тип файла, вы выполняете его поразрядно, в поле st_mode и маске типа файла S_IFMT . Затем проверьте результат на то, что вам нужно.Вот что делают макросы, упомянутые @ Ernest Friedman-Hill .Swicth лучше подходит для комплексной проверки, например
для простого случая:
if ((file_info.st_mode & S_IFMT)==S_IFDIR) puts("|| directory");
для комплексной проверки:
struct stat st;
...
switch (st.st_mode & S_IFMT) {
case S_IFREG:
puts("|| regular file");
break;
case S_IFDIR:
puts("|| directory");
break;
case S_IFCHR:
puts("|| character device");
break;
case S_IFBLK:
puts("|| block device");
break;
case S_IFLNK:
puts("|| symbolic link");
break;
case S_IFIFO:
puts("|| pipe");
break;
case S_IFSOCK:
puts("|| socket");
break;
default:
puts("|| unknown");
}