rust walkdir如何查找文件类型组

0wi1tuuw  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(150)
pub fn get_files(path: String)   {
for entry in WalkDir::new(path).into_iter().filter_map(|e| e.ok()){
    if entry.file_type().is_file() {
        if entry.path().display().to_string().ends_with(".mp3"){
            println!("{}",entry.path().display());
        }
    }
}}

嗨,伙计们,我使用此功能来检查给定文件夹中的可用MP3文件。现在我需要检查MP3和FLAC文件。而不是使用if else,我如何才能实现这一点?.

6l7fqoea

6l7fqoea1#

我想改变的事情:

  • 使用.extension(),而不是奇怪地转换成字符串,然后用.ends_with()匹配
  • 如果要处理多个结尾,请使用match
  • 不要使用String作为参数-使用&str代替。它几乎总是更好和更一般。
  • 实际上,理想的API并不使用String&str,而是使用AsRef<Path>,这在std库和WalkDir中也可以看到。
use std::{ffi::OsStr, path::Path};

use walkdir::WalkDir;

pub fn get_files(path: impl AsRef<Path>) {
    for entry in WalkDir::new(path).into_iter().filter_map(|e| e.ok()) {
        if entry.file_type().is_file() {
            let path = entry.path();
            if let Some(extension) = path.extension().and_then(OsStr::to_str) {
                match extension {
                    "mp3" => println!("MP3: {}", path.display()),
                    "flac" => println!("FLAC: {}", path.display()),
                    _ => (),
                }
            }
        }
    }
}

如果你不喜欢if let Some后面跟着match,你也可以合并它们。你选择哪一个是个人喜好。

use std::{ffi::OsStr, path::Path};

use walkdir::WalkDir;

pub fn get_files(path: impl AsRef<Path>) {
    for entry in WalkDir::new(path).into_iter().filter_map(|e| e.ok()) {
        if entry.file_type().is_file() {
            let path = entry.path();
            match path.extension().and_then(OsStr::to_str) {
                Some("mp3") => println!("MP3: {}", path.display()),
                Some("flac") => println!("FLAC: {}", path.display()),
                _ => (),
            }
        }
    }
}

相关问题