1 个不稳定版本
0.2.0 | 2020年10月16日 |
---|---|
0.1.5 |
|
0.1.4 |
|
0.1.2 |
|
#9 in #sdcard
55 每月下载量
用于 libertyos_kernel
64KB
1.5K SLoC
FAT32 文件系统库
这是一个 FAT32 文件系统库,它使用 #![no_std]
并且不使用 alloc
。
与 sdio_sdhc 和 WindowsAPI 一起通过测试。
支持的功能
- 读取
- 创建文件和目录
- 写入(覆盖和追加)
- 删除文件和目录
问题
我的设备支持 std
,我能使用这个 crate 吗?
当然可以,但我不建议这样做。你应该使用 std::fs::File
或其他 crate。
你为什么写这个 crate?
为了支持没有 std
的设备和环境,比如
- 嵌入式设备
- 引导加载程序
有更多示例吗?
如何测试(仅限 Windows)
- 编辑 lib.rs 中的 mount() 函数,更改磁盘为
\\\\.\\E:
cargotest
如何使用
你需要让你的库实现 BlockDevice
trait
pub trait BlockDevice {
type Error;
fn read(&self, buf: &mut [u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error>;
fn write(&self, buf: &[u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error>;
}
例如,我使用我的另一个库 sdio_sdhc 来实现
impl BlockDevice for Card {
type Error = CmdError;
fn read(&self, buf: &mut [u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error> {
if number_of_blocks == 1 {
self.read_block(buf, address as u32)?
} else {
self.read_multi_blocks(buf, address as u32, number_of_blocks as u32)?
}
Ok(())
}
fn write(&self, buf: &[u8], address: usize, number_of_blocks: usize) -> Result<(), Self::Error> {
if number_of_blocks == 1 {
self.write_block(buf, address as u32)?
} else {
self.write_multi_blocks(buf, address as u32, number_of_blocks as u32)?
}
Ok(())
}
}
现在 sdio_sdhc 库支持 FAT32 文件系统。然后,将 fat32 库添加到你的应用程序中
# if no feature config, the BUFFER_SIZE is 512 Bytes
fat32 = "0.2"
如果你的卡块大小不同,比如 1024 字节
[dependencies.fat32]
version = "0.2"
default-features = false
features = ["1024"]
然后,你可以进行一些测试
// Card from sdio_sdhc crate
let card = Card::init().unwrap();
// Volume from fat32 crate
let cont = Volume::new(card);
// cd root dir
let root = cont.root_dir();
// create file named test.txt
root.create_file("test.txt").unwrap();
// open file
let mut file = root.open_file("test.txt").unwrap();
// write buffer to file
file.write(&[80; 1234]).unwrap();
如果一切顺利,文件在根目录中创建,大小为 1234 字节。