我正在尝试使用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为什么没有警告,它只是说将文件内容读入缓冲区,这看起来像是一个令人误解的例子。

10-08 11:04