【问题标题】:rust main fn read dir result error cannot compilerust main fn 读取目录结果错误无法编译
【发布时间】:2020-06-11 07:59:50
【问题描述】:

我是 rust 新手,正在尝试从以下地址读取 Win10 上的目录:
https://rust-lang-nursery.github.io/rust-cookbook/file/dir.html

但是由于返回结果需要 2 个类型参数,代码无法编译:

std::io::Error  
std::time::SystemTimeError
use std::fs;

fn main() -> Result<()> {
    let current_dir = "C:/temp/";

    println!(
        "Entries modified in the last 24 hours in {:?}:",
        current_dir
    );

    for entry in fs::read_dir(current_dir)? {
        let entry = entry?;
        let path = entry.path();

        let metadata = fs::metadata(&path)?;
        let last_modified = metadata.modified()?.elapsed()?.as_secs();

        if last_modified < 24 * 3600 && metadata.is_file() {
            println!(
                "Last modified: {:?} seconds, is read only: {:?}, size: {:?} bytes, filename: {:?}",
                last_modified,
                metadata.permissions().readonly(),
                metadata.len(),
                path.file_name().ok_or("No filename")?
            );
        }
    }

    Ok(())
}

这里是游乐场链接:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3af53ffa4d1cc6ae4c774f36514dd657

【问题讨论】:

    标签: rust readfile


    【解决方案1】:

    如果你点击sn-p右上角的“展开”按钮,你会看到默认隐藏的位:

    use error_chain::error_chain;
    
    use std::{env, fs};
    
    error_chain! {
        foreign_links {
            Io(std::io::Error);
            SystemTimeError(std::time::SystemTimeError);
        }
    }
    
    fn main() -> Result<()> {
       // ...
    

    这些位非常相关,因为默认情况下error_chain! automatically generates a Result alias 这样你只需要指定“Ok”参数,另一个是生成的错误类型(类似于std::io::Result,是std::result::Result&lt;T, std::io::Error&gt;的typedef)。

    所以你需要在复制它之前扩展 sn-p(error_chain 在操场上可用)或手动滚动 Result 别名......虽然在这里你可以定义 @987654329 可能是错误类型@ 它应该可以工作。

    这种(食谱的)行为在 about 页面的 a note about error handling 部分进行了解释,尽管我不能说我喜欢它,因为食谱通常不是你从头到尾阅读的东西。

    【讨论】:

    • 我已将其更改为:fn main() -> Result>
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    相关资源
    最近更新 更多