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

GPL-3.0-or-later

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 类型是不透明的,这里提供了它们的透明副本,您将需要使用它们。这些类型中的大多数都有一个内部类型 (例如 FileFileInner),以便使 Diskit 接口对象安全和该库易于使用。

为了使 StdDiskit 尽可能无开销,大多数类型都有一个 Option<StdsVersionOfThisType>,在您的实现中应该是 None

如果您的 diskit 内部仍然需要访问磁盘,请考虑将这些委托给其他 diskit,例如 LogDiskit 所做的那样。

diskit 的大小

磁盘块应该尽可能小且便宜地可复制(没有强制执行的方式或理由)。这是因为这个库应该针对StdDiskit进行优化(尽管它可能不是最有用,但预计将是使用最多的diskit),并且在将diskit支持添加到legacylisten时,很明显,为了良好的可用性和性能,磁盘块通常被复制并按值传递。

如果你的磁盘块大于一个usize,考虑将其包装在一个Arc中。

稳定性

Diskit仍处于非常早期的版本,没有任何东西是稳定的,尽管我尽量保持其稳定。

贡献

我专门为legacylisten编写了这个库,并且只添加了(主要)我需要的功能,所以它仍然在正常使用中缺乏很多功能。如果你需要额外的功能(或功能),或者有其他想法如何使其变得更好,请不要犹豫,请分享它或实现它。

依赖项

~0.1–29MB
~376K SLoC