Перебирать листовые каталоги - PullRequest
0 голосов
/ 28 января 2020

Я хочу напечатать все листовые каталоги древовидной структуры, начиная с заданного пути. Мое определение для «конечного каталога» - это любой каталог без подкаталогов.

У меня есть этот код:

for e in WalkDir::new(path)
   .into_iter()
   .filter_map(|e| e.ok()) {
   if e.metadata().unwrap().is_dir() {
       let mut has_subdir = false;
       for entry in fs::read_dir(e.path()).unwrap() {
           let path = entry.unwrap().path();
           if path.is_dir() {
               has_subdir = true;
               break;
           }
       }
       if (!has_subdir) {
           println!("{}", e.path().display());
       }
   }
}

Это работает, но я не думаю, что это идиоматизм c , Я хотел бы получить результат как понимание списка.

1 Ответ

0 голосов
/ 28 января 2020

В итоге я решил это следующим образом:

fn is_leaf(entry: DirEntry) -> Result<DirEntry, Error> {
    if !entry.metadata()?.is_dir() {
        return Err(Error::new(ErrorKind::Other, "not leaf dir"))
    }

    for e in fs::read_dir(entry.path())? {
        if e?.path().is_dir() {
            return Err(Error::new(ErrorKind::Other, "not leaf dir"))
        }
    }

    Ok(entry)
}

fn leaf_dirs(path: &Path) -> impl Iterator<Item = PathBuf> {
    WalkDir::new(path)
        .follow_links(true)
        .into_iter()
        .filter_map(|e| e.ok())
        .filter_map(|e| is_leaf(e).ok())
            .map(|e| e.into_path().to_path_buf())
}

Не уверен, что это идиоматизм c Rust, но он делает то, что я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...