AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76955637
Accepted
Bill Haack
Bill Haack
Asked: 2023-08-23 01:31:21 +0800 CST2023-08-23 01:31:21 +0800 CST 2023-08-23 01:31:21 +0800 CST

Rust:遍历文件夹并打开每个文件

  • 772

我是 Rust 的新手(第一周),在访问迭代器内的变量时遇到问题。如果这是一个重复的问题,我提前道歉。我什至不知道如何明智地提出这个问题。

另外,有人可以指出我如何在不同线程中处理每个文件的正确方向吗?

let files = fs::read_dir(path).unwrap();

for file_name in files {
   println!("Processing File: {}", file_name.unwrap().path().display());
   // how do I pass the file name to open?
   // everything I try I get a 'file_name moved due to this method call' error
   let file = File::open(file_name.....).expect("Unable to open file");

}

multithreading
  • 2 2 个回答
  • 34 Views

2 个回答

  • Voted
  1. Best Answer
    prog-fh
    2023-08-23T02:13:08+08:002023-08-23T02:13:08+08:00

    由于您是第一次研究这个问题,我想一个分步示例可以帮助您。当然,存在更短的方法来完成等效操作(特别是,此函数非常方便,可以在一次调用中打开和读取所有内容)。

    由于与底层系统有很多交互,几乎每个操作都可能失败。我决定每次都使用显式语句来显式处理错误match。同样,有很多方法可以处理成功/失败。

    use std::io::Read; // for .read_to_end()
    
    fn main() {
        let path = ".";
        let entries = std::fs::read_dir(path).unwrap();
        for entry in entries {
            match entry {
                Ok(entry) => {
                    println!("Processing entry: {:?}", entry);
                    let file = std::fs::File::open(entry.path());
                    match file {
                        Ok(mut file) => {
                            let mut buffer = Vec::new();
                            let content = file.read_to_end(&mut buffer);
                            match content {
                                Ok(sz) => {
                                    println!("  got {} bytes", sz);
                                    // we should work with buffer here
                                }
                                Err(e) => {
                                    println!("  read error: {:?}", e);
                                }
                            }
                        }
                        Err(e) => {
                            println!("  open error: {:?}", e);
                        }
                    }
                }
                Err(e) => {
                    println!("  entry error: {:?}", e);
                }
            }
        }
    }
    /*
    Processing entry: DirEntry("./.cargo")
      read error: Os { code: 21, kind: IsADirectory, message: "Is a directory" }
    Processing entry: DirEntry("./src")
      read error: Os { code: 21, kind: IsADirectory, message: "Is a directory" }
    Processing entry: DirEntry("./Cargo.toml")
      got 972 bytes
    Processing entry: DirEntry("./target")
      read error: Os { code: 21, kind: IsADirectory, message: "Is a directory" }
    Processing entry: DirEntry("./SAVE_rust-toolchain")
      got 8 bytes
    Processing entry: DirEntry("./Cargo.lock")
      got 154 bytes
    */
    
    • 2
  2. Spandan Roy
    2023-08-23T01:41:14+08:002023-08-23T01:41:14+08:00

    好吧,我认为 Rust 编译器给了你一个非常有用的消息!

    移动值的使用:file_name 移动后此处使用的值 main.rs(11, 34):file_name由于此方法调用而移动 main.rs(11, 24):帮助:考虑调用.as_ref()或.as_mut()借用类型的内容 main.rs(10, 9): 移动发生是因为file_namehas type Result<DirEntry, std::io::Error>,它没有实现Copy特征 result.rs(1083, 19):Result::<T, E>::unwrap取得接收者的所有权self,该接收者移动file_name

    只需使用 as_ref() ,文件名就会作为引用传递,而不是被移动。

    let files = fs::read_dir(path).unwrap();
    
    for file_name in files {
        println!("{}", file_name.as_ref().unwrap().path().display());
        let file = File::open(file_name.unwrap().path()).unwrap();
    }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve