20191025(30) RT-Thread 虚拟文件系统的读写操作

目的

1 掌握 虚拟文件系统创建文件及实现流程(Finsh 支持 Unix 指令可自行学习/如何使用 Finsh 建议自学)


重点

1 env 配置虚拟文件系统
2 头文件添加 #include

正文

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);

还可以设置读取文件的文件夹位置,用以提高效率,由于暂时个人用不到就不深入理解,只知道有这么一回事就好了,今日到此为止

你可能感兴趣的:(RT-Thread)