首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tokio::fs复制文件

如何使用tokio::fs复制文件
EN

Stack Overflow用户
提问于 2019-07-14 15:31:45
回答 1查看 1.2K关注 0票数 4

我正在尝试使用tokio复制一个文件以进行异步操作。我看到tokio没有公开任何像tokio::fs::copy这样的方法,它可以为我完成这项工作(比如用于同步操作的等效std::fs::copy )。

在尝试实现这样的方法时,我实际上无法使用tokio::fs::File::create创建一个文件,也就是说,以下代码不会创建任何文件:

代码语言:javascript
复制
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中?

下面是指向游乐场的链接

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-14 16:48:16

现在,tokio::fs在版本Tokio 0.2.11中有了自己的copy实现。(参考文献)

代码语言:javascript
复制
//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,它将所有字节从输入流复制到输出流。

代码语言:javascript
复制
//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中。

它直到文件结束时才会读取,只有一次调用。我不知道为什么此读取示例没有警告,它只是说将文件的内容读入缓冲区,这看起来是一个误导性的例子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57028769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档