我正在尝试使用tokio复制文件以进行异步操作。我看到tokio没有公开像tokio::fs::copy
这样对我有用的任何方法(例如同步操作的等效std::fs::copy
)。
在尝试实现这种方法时,我实际上无法使用tokio::fs::File::create
创建文件,即以下代码不会创建任何文件:
tokio::fs::File::open("src.txt")
.and_then(|mut file| {
let mut content = Vec::new();
file.read_buf(&mut content)
.map(move |_| tokio::fs::File::create("dest.txt"))
})
.map_err(Error::from)
.map(drop);
如何使用tokio和async
src.txt
方法将dest.txt
复制到fs
中?这是Playground的链接
最佳答案
现在tokio::fs
在 Tokio 0.2.11 版本中具有自己的copy
实现。 (reference)
//tokio = {version = "0.2.11", features = ["full"] }
#[tokio::main]
async fn main()-> Result<(), ::std::io::Error>{
tokio::fs::copy("source.txt","target.txt").await?;
Ok(())
}
实现基本上是 async-await 版本的以下代码,请参见source code
没有异步等待(Tokio 0.1.x)
您可以使用
Copy
中的tokio::io
future,它将所有字节从输入流复制到输出流。//tokio-0.1.22
tokio::fs::File::open("src.txt")
.and_then(|mut file_in| {
tokio::fs::File::create("dest.txt")
.and_then(move |file_out| tokio::io::copy(file_in, file_out))
})
.map_err(Error::from)
.map(drop);
Playground
您的代码无法正常工作,因为
read_buf
返回的是Poll
而不是Future
,因此它不会与内部代码结合使用。如果生成由Future
(full code)创建的tokio::fs::File::create
,它将对小型文件执行相同的工作。但是要小心from the reference of read_buf:
直到一次调用文件结束,它才会读取。我不知道this read example为什么没有警告,它只是说将文件内容读入缓冲区,这看起来像是一个令人误解的例子。