c语言实现tree指令简易功能 打印文件目录结构

您所在的位置:网站首页 linux打印文件树 c语言实现tree指令简易功能 打印文件目录结构

c语言实现tree指令简易功能 打印文件目录结构

2024-07-13 03:05:30| 来源: 网络整理| 查看: 265

开门见山,上源码

代码 #include #include #include #include void T(DIR *dir,int depth,char path[]) { char tmp[255]; //路径备份 if (dir==NULL) return; //递归边界 while(1) { struct dirent *de=readdir(dir); if(de==NULL) //如果当前层没有文件了,就退出,循环边界 return; if(strcmp(de->d_name,"..")==0||strcmp(de->d_name,".")==0) continue; //过滤掉当前目录和父目录 if(de->d_type==DT_REG) //如果是普通文件,直接输出名字 { for(int i=0;id_name); } else if(de->d_type==DT_DIR) //如果是目录文件 { strcpy(tmp,path); //备份一下path,防止破坏path for(int i=0;id_name); strcat(tmp,"/"); strcat(tmp,de->d_name); //拼接绝对路径 DIR *p=opendir(tmp); //打开下层目录 T(p,depth+1,tmp); //递归调用,深度+1 closedir(p); //递归结束记得关闭打开的目录 } } } int main(int argc,char *argv[]) { DIR *dir; char path[255]; //分为三种情况处理输入: if(argc==1) //1:如果传入参数只有一个,相当于只有命令,没有参数,即为打印当前目录 { getcwd(path,sizeof(path));//用系统调用getcwd获取当前目录 dir=opendir(path); //打开当前目录文件 printf(".\n");//输出当前路径,即为. } else { char *p=argv[1]; if(p[0]=='/') //2.如果传入的目录为绝对路径(即为/开头) { dir=opendir(argv[1]); //直接用这个绝对路径打开 printf("%s\n",argv[1]); //输出当前绝对路径 strcpy(path,argv[1]); //把绝对路径备份给path,用作下面递归函数的参数 } else //3.如果传入的目录为相对路径 { printf("%s\n",argv[1]); //先输出 getcwd(path,sizeof(path)); //获取当前绝对路径 strcat(path,"/"); //再和输入的相对路径拼接成绝对路径 strcat(path,argv[1]); dir=opendir(path); } } T(dir,1,path); //递归函数 closedir(dir); //关闭文件 return 0; } 递归函数T详解 参数 void T(DIR *dir,int depth,char path[])

第一个参数DIR *dir是文件资源描述符,表示打开的文件 第二个参数int depth是当前的递归深度,初始为1,用于控制树形结构的输出 第三个参数char path[]是当前打开的这个文件所在的目录的绝对路径,因为可能要递归地不断去打开新的文件,但是无论在递归的何处调用系统调用getcwd函数,它返回的都是程序所在的当前目录,所以不能用getcwd函数,而应该自己动态的维护一个当前递归深度的绝对路径,即path,可以利用path拼接成下层要打开的文件的绝对路径,从而打开下层的目录。

边界控制 if (dir==NULL) return;

文件刚进来,如果发现文件资源描述符dir为空了,立即return,这说明调用它的地方文件没打开,打不开了,进入了递归的边界。

过滤掉当前目录.和父目录…

程序应该是不断地递归向下的,一直向下到不能递归为止,但是在.和…处会循环的递归,破坏了程序本来的逻辑。 注意,这里是判断de->d_name和他们是否相等,注意是判断字符串是否相等,应该用strcmp,而不是==!很容易出错

当前目录的绝对路径备份

在路径拼接的时候,不能直接用path来拼接,因为可能下层要打开的文件不止一个,那你上一个文件拼完,破坏了path,现在的这个文件用path就拼不成正确的绝对路径了,所以要用tmp来备份path,每次拼接只对tmp进行操作。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭