1 个不稳定版本
0.1.0 | 2022年6月8日 |
---|
#15 in #seek
12KB
224 行
tokio-take-seek
这为 tokio::io::Take
提供了一个包装,它提供了 tokio::io::AsyncSeek
实现(只要内部使用的处理程序也实现了它)。想法是使用 Take
实现作为 上限,不允许读取超过该点,当调用 seek
操作时,底层读取字节数的极限将得到适当的更新。
提供的 AsyncTakeSeekExt
trait 为实现 AsyncRead + AsyncSeek + Unpin
的任何类型提供了 take_with_seek
方法,用于创建包装。
实现
当前实现必须在每次调用 seek
时内部执行两个查找。第一个 seek
使用 SeekFrom::current(0)
执行,并且它的结果用于确定流移动了多少,以便正确更新 Take
的内部限制。
使用示例
在这个示例中,我们使用 take_with_seek
来保证字符串不会读取超过期望的限制,同时仍然能够在创建界限之后在读取器上执行查找操作。
async fn basic_seek_and_reed() {
let file = tempfile::NamedTempFile::new().unwrap();
// 21v 38v
fs::write(file.path(), "this will be skipped|this will be read|this will be guarded")
.await
.unwrap();
let mut handle = TakeSeek::new(take::take(fs::File::open(file.path()).await.unwrap(), 38));
handle.seek(SeekFrom::Start(21)).await.unwrap();
let mut data = String::default();
handle.read_to_string(&mut data).await.unwrap();
assert_eq!(data, "this will be read");
}
依赖关系
~2.1–3MB
~49K SLoC