如何对ReadDir迭代器进行排序

rap*_*2-h 9 iterator rust

我可以显示如下目录列表:

use std::fs;

fn main() {
    let paths = fs::read_dir("./").unwrap();
    for path in paths {
        println!("Name: {}", path.unwrap().path().display())
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在ReadDir迭代之前对迭代器进行排序吗?目录名称是类似日期的数字201610131503.我阅读了文档,ReadDir但是没有找到内置函数.也许我不知道如何搜索?

Chr*_*son 10

ReadDir只能一次读取一个条目,因此在迭代之前无法对其进行排序.没有排序的readdir系统调用(至少在我知道的平台上没有,这意味着没有可移植的系统调用).

所以唯一的选择是读入Vec并排序:

use std::fs;

fn main() {
    let mut paths: Vec<_> = fs::read_dir("/").unwrap()
                                              .map(|r| r.unwrap())
                                              .collect();
    paths.sort_by_key(|dir| dir.path());
    for path in paths {
        println!("Name: {}", path.path().display())
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 `.filter_map(|r| r.ok())` 将跳过所有属于 `Err` 的条目,而不使用 `unwrap()`。 (3认同)

She*_*ter 6

我可以在ReadDir迭代之前对迭代器进行排序吗?

基本上没有.在macOS和Linux上,使用该readdir_r功能.这不保证以任何特定顺序返回.一般情况下,它会在最快的顺序返回/最简单的文件系统,它可以改变你每次调用它.

您需要收集项目,对它们进行排序,然后重新进行迭代.