1:Linux shell命令tree 模拟实现_shell 树代码

编程代码

#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/stat.h>
#include<unistd.h>

void print_tree(const char* dirname, int indent) {
    DIR *pdir = opendir(dirname);
    struct dirent *pd;
    struct stat sbuf;
    chdir(dirname);

    while ((pd = readdir(pdir)) != NULL) {
        lstat(pd->d_name, &sbuf);
        if (strcmp(pd->d_name, ".") == 0 || strcmp(pd->d_name, "..") == 0) {
            continue;
        }
        for (int i = 0; i < indent - 1; ++i) {
            
            printf("|   ");
        }
        printf("|_%s\n", pd->d_name);
        if (S_ISDIR(sbuf.st_mode)) {
            print_tree(pd->d_name, indent + 1);
        }
    }

    chdir("..");
    closedir(pdir);
}

int main(int argc, char* argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
        exit(1);
    }
    printf("%s\n", argv[1]);
    print_tree(argv[1], 1);
    return 0;
}

技术知识

主要的编程思想是递归,递归调用``print_tree()

对文件IO的结构和读取学习了解。下面是文件结构:

DIR结构体:
struct __dirstream
{
    void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
    char *__data; /* Directory block.   */
    int __entry_data; /* Entry number `__data' corresponds to.   */
    char *__ptr; /* Current pointer into the block.   */
    int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
    size_t __allocation; /* Space allocated for the block.   */
    size_t __size; /* Total valid data in the block.   */
    __libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};
    
typedef struct __dirstream DIR;

opendir函数        DIR *opendir(const char *name);        //打开文件目录   
readdir函数        struct dirent *readdir(DIR *dirp);          //读取文件目录    
closedir函数        int closedir(DIR *dirp);                        //关闭文件目

标准IO打开或关闭一个文件流  
		fopen  
		头文件
			#include <stdio.h>
		函数功能
			用来打开一个普通的文件(文本文件/二进制文件)
		函数原型
			FILE *fopen(const char *pathname, const char *mode);
		函数参数 
			const char *pathname		//要打开的哪个文件的文件名
			const char *mode			//打开文件的方式:有如下几种:  
				"r": 只读打开。文件不存在。则报错: 
					打开后,光标在开头
				"r+":读写打开。文件不存在,则报错:
					打开后,光标在开头。
				"w":只写打开,文件不存在,则创建: 
					打开后,文件内容截短(文件内容被清掉)
				"w+":读写打开。文件不存在,则创建:
					打开后,文件内容截短(文件内容被清掉)
				"a":apepen 追加打开,文件不存在,则创建: 
					打开后,光标在末尾。文件内容不会被截短
				"a+":读写打开。文件不存在,则创建
					原始读的位置在开头,原始写的位置在末尾·
		函数返回值 
			成功:返回打开文件指针。FILE*
				在标准IO中,FILE*代表一个打开的文件
					
			失败:返回NULL,同时errno被设置
struct stat: 
				struct stat {
				   dev_t     st_dev;        用来标识容纳该文件的那个设备的设备号
				   ino_t     st_ino;        该文件的inode的编号
				   mode_t    st_mode;       文件权限位(包含文件的类型)
								
				   nlink_t   st_nlink;      该文件的硬链接数
				   uid_t     st_uid;        文件所有者用户的id
				   gid_t     st_gid;        文件的所有者的组id
				   dev_t     st_rdev;       设备号(假如该文件是一个设备)
				   off_t     st_size;       文件内容的大小 
																
				   blksize_t st_blksize;    块大小(512字节为一块)
				   blkcnt_t  st_blocks;     该文件占多少块
				   struct timespec st_atim; 最后访问"文件内容"的时间
				   struct timespec st_mtim; 最后修改“文件内容”的时间
				   struct timespec st_ctim; 最后修改"文件属性"的时间 inode 
				}
			其中:
			(1)st_mode包含文件的类型与权限,用位域(bit位),可以用下列宏来 
			解析:   
				struct stat st;
				st.st_mode  
				S_ISREG(st.st_mode) 为真则表示该文件是 普通文件 -
				S_ISDIR(st.st_mode) 为真则表示该文件是 目录		d 
				S_SCHR(st.st_mode)  为真则表示该文件是 字符设备 c 
				S_ISBLK(st.st_mode) 为真则表示该文件是 块设备	b 
				S_ISFIFO(st.st_mode)为真则表示该文件是 管道文件 p
				S_ISLINK(st.st_mode)为真则表示该文件是 符号链接文件 l	
				S_ISSOCK(st.st_mode)为真则表示该文件是 套接字文件 s 
			(2)st_mode还包含了文件的权限为,可以如下代码来解析  
				if(st.st_mode & S_IRUSR){
					//user有read的权限
				}
				else {
					//user 没有read的权限 
				}
				....
				S_IWUSR, S_IXUSR
				S_IRGRP, S_IWGRP, S_IXGRP
				S_IROTH, S_IWOTH, S_IXOTH
			(3)off_t     st_size;       文件内容的大小 
				对于普通文件,就是指本身文件内容的大小
				对于符号链接(软链接),文件内容是什么?
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/ed255dfd55b6b27aa75ecf2a4e5afb5d.png)

![img](https://img-blog.csdnimg.cn/img_convert/f6136471e7745ebe0232c4cfed97c38d.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/f543802a43fdee6cc0b41d4a53ca72eb.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/ead6757910c8863112826f0364334b14.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f1a6cf8e5694f6c9ccd32f7ac9c3f09.png)

![img](https://img-blog.csdnimg.cn/img_convert/e93d0ec2bfe3fbb746a5f37bbb1c9d8b.png)

![](https://img-blog.csdnimg.cn/img_convert/47b441fb6686bc0a14745b25d45aeb4d.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值