2

我正在尝试使用 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;
}
4

2 回答 2

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;
    }
}
于 2013-05-01T06:55:02.040 回答
1

From man 2 stat:

The following POSIX macros are defined to check the file type using the st_mode field:

       S_ISREG(m)  is it a regular file?

       S_ISDIR(m)  directory?
于 2013-05-01T04:54:15.587 回答