在 for 循环中从 DirEntry 获取文件信息

get file information from DirEntry in a for loop

我是 Rust 的新手。我正在尝试构建一个 JSON 对象,其中键是文件名,值是文件内容。

到目前为止,我有:

use std::fs;
use std::io;
use std::env;
use std::collections::HashMap;
use std::path::{Path, PathBuf};

fn main() {
    make_json();
}

fn make_json() -> io::Result<()> {
    let mut modules = HashMap::new();
    let mut dir = env::current_dir().unwrap();
    let mut read_dir = fs::read_dir(dir);

    for entry in try!(read_dir) {
        let entry = try!(entry);
        let file_name = entry.path().file_name().unwrap().to_string_lossy();
        modules.insert(file_name, "");
    }

    Ok(())
}

当我去编译它时,我得到

src/main.rs:19:25: 19:37 error: borrowed value does not live long enough
src/main.rs:19         let file_name = entry.path().file_name().unwrap().to_string_lossy();
                                       ^~~~~~~~~~~~
note: in expansion of for loop expansion
src/main.rs:17:5: 21:6 note: expansion site
src/main.rs:13:38: 23:2 note: reference must be valid for the block suffix following statement 0 at 13:37...
src/main.rs:13     let mut modules = HashMap::new();
src/main.rs:14     let mut dir = env::current_dir().unwrap();
src/main.rs:15     let mut read_dir = fs::read_dir(dir);
src/main.rs:16 
src/main.rs:17     for entry in try!(read_dir) {
src/main.rs:18         let entry = try!(entry);
               ...
src/main.rs:19:9: 19:77 note: ...but borrowed value is only valid for the statement at 19:8
src/main.rs:19         let file_name = entry.path().file_name().unwrap().to_string_lossy();
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:19:9: 19:77 help: consider using a `let` binding to increase its lifetime
src/main.rs:19         let file_name = entry.path().file_name().unwrap().to_string_lossy();
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error

我明白这个错误告诉我什么;条目是在 for 循环的范围内定义的,因此如果我将它存储到 HashMap 它将不再是有效内存,因为内存中的位置已经被释放。我明白了。

我不明白的是,我如何在不使用某种闭包的情况下访问 read_dir 中的 DirEntry,因为我需要在检索它们的任何闭包之外获取它们的信息英寸

我遇到的一切都无法帮助我。

DirEntry.path() returns a PathBuf,即 'static(即它不包含非静态引用,是一个完全独立的对象)。 就是问题所在

PathBuf.file_name() returns Option<&OsStr>,对该对象的引用,以及 OsStr.to_string_lossy() returns Cow<str>。请注意,最后它是 而不是 'static;恢复被删除的生命周期后,它是 fn to_string_lossy<'a>(&'a self) -> Cow<'a, str>。这是为了提高效率,因为如果路径是合法的 UTF-8,那么就没有必要去创建一个全新的拥有的字符串(String),它可以将它保留为一个字符串切片(&str)。 (因为这就是 Cow<'a, str>:它的变体,填充了泛型,是 Owned(String)Borrowed(&'a str)。)

您需要在此位置将 Cow<str> 变成 String。这是通过 into_owned method of Cow<T>.

完成的

这行代码就这样变成了:

let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();

处理 Rust 文件系统时的问题迫使我创建这个 Rust 库 brown

在处理 Rust fs 时,特别是在处理循环时,主要问题是每个东西 return 都是另一个东西,然后我们需要转换那个东西。 我们需要一些东西来为我们压扁物品

My suggestion :: Do not do any calculations etc in a loop, it should just have function calls to a well tested library and just checking its results.