迭代std :: fs :: ReadDir并仅从路径

时间:2015-07-04 22:54:51

标签: rust

我正在试图弄清楚如何用铁锈做一个'列表理解'。我有一个ReadDir iter我要映射,只获取路径的文件名。我认为它看起来像是:

// get current dir paths
let paths = fs::read_dir(&Path::new(
    &env::current_dir().unwrap())).unwrap();

// should contain only filenames
let files_names = paths.map(|&x| {
    match (*x).extensions() {
        Some(y) => y,
        None => //What do I do here? break?
};

我知道我的表情很可能会被破坏,但有没有办法让这个表达能够file_names绑定到?

1 个答案:

答案 0 :(得分:20)

您可能希望使用Path的{​​{1}}方法生成文件名,如果它是常规文件,这就是它返回{{1 }}

我想你想要忽略非常规文件的文件名,即file_name()将返回Option的文件名,在这种情况下你可能想要利用{{ 1}}的{​​{1}}方法基本上就像过滤器和地图放在一起,即你能够映射(在这种情况下是路径 - >文件名)并通过将映射结果作为{来过滤{1}},其中file_name()表示您要过滤掉该值。

令人烦恼的是,您必须检查None迭代器返回的每个项目,因为这是Iterator类型,因此您必须查看它是否为filter_map。如果您只想忽略目录中的非Option(即None)条目(例如您没有权限的条目),则可以将其简单地转换为ReadDir使用Result的{​​{1}}方法并将其整合到Ok

您还必须尝试从返回的Ok创建Err,因为它可能不一定是UTF-8。使用OptionResult的组合,可以简单地再次忽略具有非UTF-8名称的文件(在此示例中)。

如果你忽略了非ok()目录条目和非常规文件的路径(因此在filter_map上返回String),它会是什么样子?文件名不是UTF-8的文件:

file_name()

playpen

如果您不熟悉Rust的功能流量控制功能,例如mapand_then上的OkNone等等,然后这就是展开的内容,没有忽略错误而不做错误处理。我把它留给你:

file_name()

playpen