5 个版本
0.1.4 | 2023年10月19日 |
---|---|
0.1.3 | 2023年6月8日 |
0.1.2 | 2023年2月19日 |
0.1.1 | 2022年9月8日 |
0.1.0 | 2022年9月7日 |
#478 在 文件系统
用于 3 crates
120KB
2.5K SLoC
拦截磁盘请求的实用工具
Diskit (缩写为 "Disc root kit") 努力成为一个透明的 Rust 样式根工具,用于拦截和修改对硬盘的请求。要使用它,决定您想对拦截的请求做什么,并选择适当的 diskit (例如:无拦截 -> StdDiskit
; 转发到虚拟文件系统 -> VirtualDiskit
; 记录所有请求 -> LogDiskit
), 然后将所有请求通过它路由
use std::io::{Read, Write};
use diskit::{diskit_extend::DiskitExt, Diskit, VirtualDiskit};
fn main() -> Result<(), std::io::Error>
{
// All requests are redircted to a virtual file system.
let diskit = VirtualDiskit::default();
// This writes "Hello, World!" in the newly created file "test.txt".
let mut file1 = diskit.create("test.txt")?;
file1.write_all(b"Hello, World!")?;
// You can close `file1` and it still works:
// file1.close()?;
// This reads the just created file.
let mut file2 = diskit.open("test.txt")?;
let mut buf = String::new();
file2.read_to_string(&mut buf)?;
assert_eq!(buf, "Hello, World!");
Ok(())
}
如果您想了解 diskit 在完整程序中的使用方法,请查看我为 diskit 编写的 legacylisten 程序。
创建自己的 diskit
您可以通过实现 Diskit
接口来创建自己的 diskit。
由于许多 stdlib 类型是不透明的,这里提供了它们的透明副本,您将需要使用它们。这些类型中的大多数都有一个内部类型 (例如 File
有 FileInner
),以便使 Diskit
接口对象安全和该库易于使用。
为了使 StdDiskit
尽可能无开销,大多数类型都有一个 Option<StdsVersionOfThisType>
,在您的实现中应该是 None
。
如果您的 diskit 内部仍然需要访问磁盘,请考虑将这些委托给其他 diskit,例如 LogDiskit
所做的那样。
diskit 的大小
磁盘块应该尽可能小且便宜地可复制(没有强制执行的方式或理由)。这是因为这个库应该针对StdDiskit
进行优化(尽管它可能不是最有用,但预计将是使用最多的diskit),并且在将diskit支持添加到legacylisten时,很明显,为了良好的可用性和性能,磁盘块通常被复制并按值传递。
如果你的磁盘块大于一个usize
,考虑将其包装在一个Arc
中。
稳定性
Diskit仍处于非常早期的版本,没有任何东西是稳定的,尽管我尽量保持其稳定。
贡献
我专门为legacylisten编写了这个库,并且只添加了(主要)我需要的功能,所以它仍然在正常使用中缺乏很多功能。如果你需要额外的功能(或功能),或者有其他想法如何使其变得更好,请不要犹豫,请分享它或实现它。
依赖项
~0.1–29MB
~376K SLoC