以前にディレクトリを再帰処理してディレクトリとシンボリックリンクを表示するプログラムを書きましたが、crateを眺めていると同じような処理をするcrateが既にありました。
walkdir crateというもので、以前のコードを書き換えてこちらのcrateを試してみました。
use clap::Parser;
use std::fs;
use std::io::Error;
use walkdir::WalkDir;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
/// target directory
#[arg(short, long, default_value_t = String::from("./dir") )]
dir: String,
}
fn main() -> Result<(), Error> {
let args = Args::parse();
let dir_string = args.dir.to_string();
for entry in WalkDir::new(dir_string) {
let entry = entry?;
let file_type = entry.file_type();
let path = entry.path();
if file_type.is_dir() {
println!("{}", path.display());
}
if entry.path_is_symlink() {
println!(
"{}@ -> {}",
path.display(),
fs::read_link(path).unwrap().display()
);
}
}
Ok(())
}
[dependencies]
clap = { version = "4.5.29", features = ["derive"] }
walkdir = "2.5.0"
./dirに下記のようにテスト用のディレクトリ構造を作っています。
a -> aaa
aaa
b -> bbb
bbb
c -> ccc
ccc
実行した結果がこちらです。
./dir
./dir/a@ -> aaa
./dir/c@ -> ccc
./dir/b@ -> bbb
./dir/aaa
./dir/ccc
./dir/bbb
コード量はあまり変わらないですが、単純な処理は楽して書けそうなので良いかもしれません。
また、以前のtokio版ディレクトリ再帰的取得のプログラムのように非同期に取得する動作と思われるasync-walkdir crateやjwalk crate、Linuxだと早く動作しそうなfts crateなど様々な選択肢があるので試してみるのもいいかもしれません。