не может отличить каталог от файла с помощью 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;
}

person PptSbzzgt    schedule 01.05.2013    source источник


Ответы (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;
    }
}
person john    schedule 01.05.2013
comment
Сделав, как сказал Джон, мне удалось остановить бесконечную рекурсию. Благодарю вас! Однако он все еще не может отличить обычный файл от папки... - person PptSbzzgt; 02.05.2013

С 1_:

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

       S_ISREG(m)  is it a regular file?

       S_ISDIR(m)  directory?
person Diego Torres Milano    schedule 01.05.2013