目的
1 掌握 虚拟文件系统创建文件及实现流程(Finsh 支持 Unix 指令可自行学习/如何使用 Finsh 建议自学)
重点
1 env 配置虚拟文件系统
2 头文件添加 #include <dfs_posix.h>
正文
1 创删改读写–文件
//读写创
static void readWrite_sample(void) {
int fd = 0;
int size = 0;
char s[] = "RT_Thread Programmer!";
char buffer[80];
rt_kprintf("Write string %s to test.txt \n", s);
//“/text.txt" 文件的绝对路径,/ 在 unix 系统代表根目录, /text.txt 是指根目录下的 text.txt 文件
//”/dir/text.txt" 表示在 dir 目录下的 text.txt 文件
fd = open("/text.txt", O_WRONLY | O_CREAT); // 写(不存在则创建)
if (fd >= 0) {
write(fd, s, sizeof(s));
close(fd); //在文件操作过程中,必须建立打开一个关闭的一个概念
rt_kprintf("Write Ended!");
}
fd = open("/text.txt", O_RDONLY);
if (fd >= 0) {
size = read(fd, buffer, sizeof(buffer)); // 在 linux 中 ssize_t read() 如果遇到错误就返回 -1
close(fd);
rt_kprintf("Read info %s \n", buffer);
if (size < 0)
return ;
}
}
MSH_CMD_EXPORT(readWrite_sample, readWrite sample);
//改名字
static void changeName_sample(void) {
rt_kprintf("%s ==> %s \n", "/text.txt", "/text1.txt");
if (rename("/text.txt", "/text1.txt") < 0)
rt_kprintf("err \n");
else
rt_kprintf("success \n");
}
MSH_CMD_EXPORT(changeName_sample, changeName sample);
//删除文件
static void rmFile_sample(void) {
if (unlink("/text1.txt") < 0) {
rt_kprintf("err \n");
} else {
rt_kprintf("success \n");
}
}
MSH_CMD_EXPORT(rmFile_sample, rm File);
参数 | 描述 |
---|---|
O_RDONLY | 只读方式打开文件 |
O_WRONLY | 只写方式打开文件 |
O_RDWR | 以读写方式打开文件 |
O_CREAT | 如果要打开的文件不存在,则建立该文件 |
O_APPEND | 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式添加到文件的尾部 |
O_TRUNC | 如果文件已经存在,则清空文件中的内容 |
1.1 同步缓存
fsynv()
数据写到 块设备上理论上是不会立即发生的都是需要通过内核统一调用实现,通过 fsynv() 可以立即将内容写入到指定设备中
2 创删改读写–目录
//创建目录
static void createDir(void) {
int ret = 0;
ret = mkdir("/dir1", 0x777); //没有启用 unix 的 mode 统一写 0x777
if (ret < 0) {
rt_kprintf("dir err \n");
} else {
rt_kprintf("mkdir ok \n");
}
}
MSH_CMD_EXPORT(createDir, create Dir);
//删除目录
static void rmDir(void) {
int ret = 0;
ret = rmdir("/dir1"); //前提 文件夹下没有任何文件才可以删除成功
if (ret < 0) {
rt_kprintf(" rm err \n");
} else {
rt_kprintf(" rm ok \n");
}
}
MSH_CMD_EXPORT(rmDir, romver DIR);
//读取目录
static void readDir(void) {
DIR *dir;
struct dirent *d;
dir = opendir("/dir");
if (dir == RT_NULL) {
rt_kprintf("open err \n");
} else {
while ((d = readdir(dir)) != RT_NULL) {
rt_kprintf("found %s \n", d->d_name);
}
closedir(dir);
}
}
MSH_CMD_EXPORT(readDir, readDIR);
还可以设置读取文件的文件夹位置,用以提高效率,由于暂时个人用不到就不深入理解,只知道有这么一回事就好了,今日到此为止