РЕДАКТИРОВАТЬ: После некоторой помощи от форума стало ясно, что эта проблема не в использовании S_ISREG()
, а в моем использовании lstat()
. Извините за вводящий в заблуждение вопрос.
Я смотрю в каталог и пытаюсь определить разницу между обычными файлами и подкаталогами.
Я просматривал проблемы других людей с этой проблемой, и хотя некоторые из них были похожими, ни на один из них не было получено достаточно четкого ответа, чтобы исправить мой код.
int find(char *argv)
{
DIR *pointerToDir;
struct dirent *pointerToDirent;
struct stat status;
int mode;
pointerToDir = opendir(argv);
if(pointerToDir == NULL)
{
printf("Can't open that directory (or it doesn't exist)\n");
closedir(pointerToDir);
return 0;
}
else
{
while((pointerToDirent = readdir(pointerToDir)) != NULL)
{
lstat(pointerToDirent->d_name, &status);
mode = S_ISREG(status.st_mode);
if(mode != 0)
printf("%s must be a file\n", pointerToDirent->d_name);
else
printf("%s must be a dir\n", pointerToDirent->d_name);
}
closedir(pointerToDir);
return 0;
}
}
Я передаю программе тестовый каталог, в котором есть 2 подкаталога и 2 обычных файла. Макет будет примерно таким:
dir1
- sub1
- sub2
- dir1.txt
- test.c
Теперь, когда я запустил свою программу и передал "dir1" в качестве аргумента, я ожидал, что он вернет следующее:
. должен быть реж
.. должен быть директ
sub1 должен быть dir
dir1.txt должен быть файлом
sub2 должен быть dir
test.c должен быть файл
Но вместо этого возвращается, что они все "dirs". Чего мне не хватает?