我正在尝试使用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;
}
答案 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;
}
}
答案 1 :(得分:1)
来自man 2 stat
:
定义以下POSIX宏以使用检查文件类型 该 st_mode字段:
S_ISREG(m) is it a regular file? S_ISDIR(m) directory?