第2关:文件查看器
挑战任务
参加“绿盟杯”竞赛的小红遇到一个问题,她想要编写代码实现一个文件查看器,要实现指定文件夹下所有文件以及文件夹目录结构的展示。
你来帮她实现这个功能吧。
编程实现对给定文件夹目录结构的展示,如果是文件夹则在其名字之前加上+--
若是文件则加上--
,上级目录与下级目录、下级文件用两个空格作为间隔,同级下依照文件夹、文件的首字母顺序依次打印;补充完善右侧代码区中的showDirStructure(char *folderPath)
函数实现要求的功能,其中函数参数含义如下:
folderPath
:指定要显示的文件夹
输入:src/step2/root
输出:
输入:src/step2/dir
输出:
提示: 在C
语言中使用readdir
函数可以获取目录内容,使用stat
函数判断文件类型。
你可以通过如下链接下载本关涉及到的目录文件:
https://www.educoder.net/attachments/download/200773/step2Dir.zip
开始挑战吧,祝你成功!
/**************************** 函数功能: 遍历文件夹* return: void* @para folderPath: 文件夹路径
***************************/
void showDirStructure(char *folderPath)
{/********** BEGIN **********/static int floor=0; //层数for(int i=0;i<floor*2;i++)cout<<" "; //输出前置空格char buf[256];int len=0;for(int i= strlen(folderPath)-1;folderPath[i]!='/';i--) buf[len++]=folderPath[i];buf[len]='\0';for(int i=0;i<len/2;i++){char t=buf[i];buf[i]=buf[len-1-i];buf[len-1-i]=t;}cout<<"+--"<<buf<<endl;DIR *dir=opendir(folderPath);struct dirent *i=NULL;while((i=readdir(dir))!=NULL){if(!strcmp(i->d_name,".")||!strcmp(i->d_name,".."))continue;strcpy(buf,folderPath);strcat(buf,"/");strcat(buf,i->d_name);struct stat M;stat(buf,&M);if(S_ISDIR(M.st_mode)){floor+=1;showDirStructure(buf);floor-=1;}else{if(S_ISREG(M.st_mode)){char ext[256];len=0;for(int j=strlen(buf)-1;buf[j]!='.';j--)ext[len++]=buf[j];ext[len]='\0';for(int j=0;j<len/2;j++){char t=ext[j];ext[j]=ext[len-1-j];ext[len-1-j]=t;}if(!strcmp(ext,"jpg")||!strcmp(ext,"png")||!strcmp(ext,"bmp")){for(int j=0;j<(floor+1)*2;j++)cout<<" ";cout<<"--"<<i->d_name<<endl;}}}}closedir(dir);/********** END **********/
}