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