9.自己实现linux中的tree

Posted 喵小喵~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.自己实现linux中的tree相关的知识,希望对你有一定的参考价值。

运行效果:

代码:

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <string.h>
  4 #include <dirent.h>
  5 #include <sys/stat.h>
  6 
  7 void MyTree(char szPath[],int deep)
  8 {
  9     //目录用于遍历
 10     DIR *pDir;
 11     //用于存储文件信息
 12     struct dirent *pDent;
 13     //子目录名字
 14     char szSubPath[PATH_MAX];
 15     
 16     //用于判断文件的类型
 17     struct stat stInfo;
 18     //用来遍历层数,格式输出
 19     int i;
 20     
 21     //打开当前目录,获取目录列表
 22     pDir = opendir(szPath);
 23     //如果打开失败
 24     if(pDir == NULL)
 25     {
 26         perror("Fail to opendir");
 27         return;
 28     }
 29     
 30     //不断循环
 31     while(1)
 32     {
 33         //依次读取文件信息
 34         pDent = readdir(pDir);
 35         //如果读取失败,当前递归结束
 36         if(pDent == NULL)
 37         {
 38             break;
 39         }
 40         
 41         //如果获得了文件信息
 42         
 43         //过滤掉当前目录(.)和上一层目录 (..)
 44         if(strcmp(pDent->d_name,".")==0 || strcmp(pDent->d_name,"..")==0)
 45         {
 46             continue;
 47         }
 48         
 49         //格式输出
 50         for(i=0;i!=deep;i++)
 51         {
 52             printf("");
 53         }
 54         
 55         //如果是目录文件
 56         if(pDent->d_type == DT_DIR)
 57         {
 58             //红色
 59             printf("├── \\033[0;31m%s\\033[0m\\n",pDent->d_name);
 60             sprintf(szSubPath,"%s/%s",szPath,pDent->d_name);
 61             MyTree(szSubPath,deep+1);
 62         }
 63         else
 64         {
 65             stat(pDent->d_name,&stInfo);
 66             //判断是否是普通文件
 67             if(S_ISREG(stInfo.st_mode))
 68             {
 69                 //判断是否有执行权限
 70                 if(stInfo.st_mode & 0100)
 71                 {
 72                     //青色
 73                     printf("├── \\033[1;32m%s\\033[0m\\n",pDent->d_name);
 74                 }
 75                 //不能执行的文件
 76                 else
 77                 {
 78                     printf("├── %s\\n",pDent->d_name);
 79                 }
 80             }
 81             //是否是一个块文件
 82             else if(S_ISFIFO(stInfo.st_mode))
 83             {
 84                     printf("├── \\033[1;42m%s\\033[0m\\n",pDent->d_name);
 85             }
 86             //其他文件
 87             else
 88             {
 89                 printf("├── %s\\n",pDent->d_name);
 90             }
 91             
 92         }
 93     }
 94     closedir(pDir);
 95 }
 96 
 97 int main(int argc,char **argv)
 98 {
 99         //char szPath[PATH_MAX];
100         
101         
102         
103         if(argc == 2)
104         {
105             chdir(argv[1]);
106         }
107         
108         //getcwd(szPath,PATH_MAX);
109         //MyTree(szPath,0);
110         MyTree(argv[1],0);
111         
112         return 0;
113 }

 

以上是关于9.自己实现linux中的tree的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段9——JS中的面向对象编程

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

超级有用的9个PHP代码片段

Linux的tree命令

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

ASP.net MVC 代码片段问题中的 Jqgrid 实现