我正在尝试使用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和异步src.txt方法将dest.txt复制到dest.txt中?
下面是指向游乐场的链接
发布于 2019-07-14 16:48:16
现在,tokio::fs在版本Tokio 0.2.11中有了自己的copy实现。(参考文献)
//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(())
}实现基本上是异步-等待下面代码的版本,请参阅源代码
没有异步等待( Tokio 0.1.x )
您可以使用Copy未来从tokio::io,它将所有字节从输入流复制到输出流。
//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);您的代码无法工作,因为read_buf返回的是Poll,而不是Future,因此它不会与内部代码结合。如果您生成由 (全码)创建的Future,那么它将对Future进行同样的工作。
但是要小心,buf:
从这个源中提取一些字节到指定的BufMut中。
它直到文件结束时才会读取,只有一次调用。我不知道为什么此读取示例没有警告,它只是说将文件的内容读入缓冲区,这看起来是一个误导性的例子。
https://stackoverflow.com/questions/57028769
复制相似问题