版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j1137573560/article/details/83045795
第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 **********/
}