не может отличить каталог от файла с помощью stat ()

Я пытаюсь перечислить все файлы, содержащиеся в папке, используя stat (). Однако папка также содержит другие папки, содержимое которых я тоже хочу отображать. Моя рекурсия становится бесконечной, потому что stat () не может отличить папку от файла. На самом деле все файлы перечислены в виде папок. Любой совет?

using namespace std;

bool analysis(const char dirn[],ofstream& outfile)
{
cout<<"New analysis;"<<endl;
struct stat s;
struct dirent *drnt = NULL;
DIR *dir=NULL;

dir=opendir(dirn);
while(drnt = readdir(dir)){
stat(drnt->d_name,&s);
if(s.st_mode&S_IFDIR){
if(analysis(drnt->d_name,outfile))
{
cout<<"Entered directory;"<<endl;
}
}
if(s.st_mode&S_IFREG){
cout<<"Entered file;"<<endl;
}

}
return 1;
}

int main()
{
ofstream outfile("text.txt");
cout<<"Process started;"<<endl;
if(analysis("UROP",outfile))
cout<<"Process terminated;"<<endl;
return 0;
}

2

Решение

Я думаю, что ваша ошибка это что-то еще. Каждый список каталогов содержит два «псевдо-каталога» (не знаю, каков официальный термин), которые являются «.» текущий каталог и ‘..’ родительский каталог.

Ваш код следует этим каталогам, поэтому вы получаете бесконечный цикл. Вам нужно изменить свой код на что-то вроде этого, чтобы исключить эти псевдо-каталоги.

if (s.st_mode&S_IFDIR &&
strcmp(drnt->d_name, ".") != 0 &&
strcmp(drnt->d_name, "..") != 0)
{
if (analysis(drnt->d_name,outfile))
{
cout<<"Entered directory;"<<endl;
}
}
2

Другие решения

От man 2 stat:

Следующие макросы POSIX определены для проверки типа файла с помощью

Поле st_mode:

       S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?
1

По вопросам рекламы [email protected]