如何列出文件夹并返回特定文件类型的所有文件名?

时间:2018-07-19 09:21:07

标签: path rust

我已经编写了CSV解析器,允许用户输入查询字符串和CSV文件作为位置参数,并解析查询的指定文件。

我会自动在当前目录中搜索CSV文件并在其中搜索字符串,但是我在处理这些项目并将其返回以用于其他功能时遇到问题。

我当前用于文件夹搜索的代码:

fn folder_search() {
    let paths = fs::read_dir("./").unwrap();

    //let mut v = Vec::new();

    for path in paths {
        let path = path.unwrap().path();

        match path.extension() {
            Some(p) if p == "csv" => println!("{:?}", path.file_name().unwrap()),
            _ => (),
        }
    }
}

现在,我只是打印出文件扩展名。我想退回这些文件以作进一步使用,但是我不确定如何使用。

我想我可以将这些文件分配给向量,然后返回向量,但是我不确定如何将它们分配给向量。

如果我push内的path match path.extension() {...}报错,提示path的寿命不够长,据我了解,但我不知道解决此问题的正确方法是。

1 个答案:

答案 0 :(得分:2)

Path借用了实际的路径表示形式。您必须使用PathBuf,它是所拥有的等效项:

use std::{ fs, io, path::PathBuf, ffi::OsStr };

fn list_of_csv_paths(root: &str) -> io::Result<Vec<PathBuf>> {
    let mut result = vec![];

    for path in fs::read_dir(root)? {
        let path = path?.path();
        if let Some("csv") = path.extension().and_then(OsStr::to_str) {
            result.push(path.to_owned());
        }
    }
    Ok(result)
}

fn main() {
    println!("{:?}", list_of_csv_paths("./"));
}

我建议您使用glob来简化工作。