如何对ReadDir迭代器进行排序

时间:2016-10-13 13:05:56

标签: iterator rust

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

use std::fs;

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

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

2 个答案:

答案 0 :(得分:8)

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())
    }
}

答案 1 :(得分:5)

  

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

基本上没有。在macOS和Linux上,readdir_r function is used。这is not guaranteed to return in any specific order。通常,它将以文件系统最快/最简单的顺序返回,每次调用它时 都会更改。

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