Rustで任意のフォルダ内の全てのファイルを表示する

はじめに

この記事では、「Rustで任意のフォルダ内の全てのファイルを表示する方法」について書いています。

Rustを色々勉強中ですが知らないことや学んだのに忘れてしまっていたこともまだたくさんあり、Rustの勉強も兼ねて記事を書きました。

自分に向けた備忘録でもありますが、「Rustでファイルやフォルダの扱い方を知りたい」な人の一助になれば嬉しいです。

前提(環境)

私の環境のバージョン情報は以下の通りです。

説明

早速ですが、コードを以下に記します。このコードは、実行ファイルがあるフォルダ内の全てのファイルを表示(標準出力)します。

use std::path;

fn main() {
    let target_path = "./";
    let target = path::PathBuf::from(target_path);
    let files = target.read_dir().expect("このパスは存在しません");
    for dir_entry in files {
        // dir_entry(Result<DirEntry, Error>型)をfile_path(PathBuf型)に変換する
        let file_path = dir_entry.unwrap().path();
        println!("{:?}", file_path);
    }
}

このコードで重要なのはread_dir()で、このメソッドを使うことで指定したフォルダの中にある全てのファイルのパスを取得します。

このread_dir()PathBuf型に対して用意されているため、フォルダパスを&str型やString型で取得している場合はPathBuf型に変換してください(上のコードではtarget_path&str型で宣言していますが、PathBufに変換したtarget変数を用意し、それにread_dir()を使用しています。)

read_dir()で取得したもの(上の例ではfiles)はイテレータになっているため、中身を取得、処理した場合はfor文などで取り出す必要があります。

コードの実行例

例えば以下の構成になっている、普通のRustプロジェクトで考えます。

sample
├ .git
│   └ ... (省略)
├ src
│   └ main.rs  <- 上のコードが記述されている
├ target
│   └ ... (省略)
├ .gitignore
├ Cargo.lock
└ Cargo.toml

このRustプロジェクトでcargo runを実行(つまりsampleフォルダ上で上のコードを実行)した時の出力は見てみましょう。以下のようになります。

"./.git"
"./.gitignore"
"./Cargo.lock"
"./Cargo.toml"
"./src"
"./target"

sampleフォルダ内にあるファイルやフォルダが全て抽出されています。

おわりに

「Rustで任意のフォルダ内の全てのファイルを表示する方法」について解説しました。

Rustでツールを作りたい、作ろうとしている方の一助になれば幸いです。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

qiita.com