作为个人项目,根据fat32手册以及网上相关说明实现fat32文件系统,与linux系统创建的fat32兼容。
- 短文件名
- 长文件名
- 创建文件/创建文件夹
- 删除文件/删除文件夹
- 读取文件内容/清空文件内容
- 写入文件内容
- ls/cd
- 重命名
- tests
pub trait DirectoryLike {
type Error;
fn create_dir(&self, name: &str) -> Result<(), Self::Error>;
fn create_file(&self, name: &str) -> Result<(), Self::Error>;
fn delete_dir(&self, name: &str) -> Result<(), Self::Error>;
fn delete_file(&self, name: &str) -> Result<(), Self::Error>;
fn cd(&self, name: &str) -> Result<Arc<Dir>, Self::Error>;
fn open(&self, name: &str) -> Result<Arc<File>, Self::Error>;
fn list(&self) -> Result<Vec<String>, Self::Error>;
fn rename_file(&self, old_name: &str, new_name: &str) -> Result<(), Self::Error>;
fn rename_dir(&self, old_name: &str, new_name: &str) -> Result<(), Self::Error>;
}pub trait FileLike {
type Error;
fn read(&self, offset: u32, size: u32) -> Result<Vec<u8>, Self::Error>;
fn write(&self, offset: u32, data: &[u8]) -> Result<u32, Self::Error>;
fn clear(&self);
}use fat32::{BlockDevice, DirectoryLike, Fat32};
let device = FakeDevice::new("fat32-test/test.img");
let fat32 = Fat32::new(device).unwrap();
let root = fat32.root_dir();
let _ans = root.create_file("test.txt");
let ans = root.create_dir("test");
root.list().unwrap().iter().for_each(|name| {
println!("{}", name);
});
fat32.sync();examples目录下有简单的使用案例,更多的使用方式可以查看fat32-test目录下的测试。fat32-test目录下有创建fat32文件的Makefile脚本。使用前请运行脚本。如果想查看示例的效果,需要重新挂载文件系统,使用命令make umount && make mount后进入/fat查看是否正确创建文件。