Каноническим способом определения типа файла является использование закомментированного
код в этом фрагменте:
// Return the number of files in dirName. Ignore directories and links.
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
int fCt = 0;
struct dirent *dir;
DIR *d;
d = opendir(argv[1]);
if (d == NULL) {
printf("%s was not opened!\n", argv[1]);
exit(0);
}
// Count all of the files.
while ((dir = readdir(d)) != NULL) {
// struct stat buf;
// stat(dir->d_name, &buf);
// if (S_ISREG(buf.st_mode)) { fCt++; }
if (dir->d_type == 8) { fCt++; }
}
return fCt;
}
Элемент buf.st_mode возвращает 41ED (шестнадцатеричное), 16877 (десятичное) как для каталогов, так и для обычных файлов. S_ISREG не может найти правильный бит, установленный для обоих типов.
Обратите внимание, что строка:
if (dir->d_type == 8) { fCt++; }
возвращает точное количество файлов.
Почему закомментированный метод дал сбой?