【发布时间】:2020-03-26 21:30:20
【问题描述】:
我正在尝试读取文件、解密文件并返回数据。由于该文件可能非常大,我想在流中执行此操作。
我找不到实现流的好模式。我正在尝试做这样的事情:
let stream = stream::unfold(decrypted_init_length, |decrypted_length| async move {
if decrypted_length < start + length {
let mut encrypted_chunk = vec![0u8; encrypted_block_size];
match f.read(&mut encrypted_chunk[..]) {
Ok(size) => {
if size > 0 {
let decrypted = my_decrypt_fn(&encrypted_chunk[..]);
let updated_decrypted_length = decrypted_length + decrypted.len();
Some((decrypted, updated_decrypted_length))
} else {
None
}
}
Err(e) => {
println!("Error {}", e);
None
}
}
} else {
None
}
});
问题是上述异步闭包中不允许f.read出现以下错误:
89 | | match f.read(&mut encrypted_chunk[..]) {
| | -
| | |
| | move occurs because `f` has type `std::fs::File`, which does not implement the `Copy` trait
| | move occurs due to use in generator
我不想在闭包内部打开f。有没有更好的方法来解决这个问题?我可以使用不同的 crate 或 trait 或方法(即不是 stream::unfold)。
【问题讨论】:
-
@squiguy 不,我使用的是常规文件类型,即
std::fs::File。 -
很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在一个全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
标签: rust rust-tokio hyper