Rustでファイルの名前や拡張子を抜き出す方法

はじめに

この記事では、「Rustでファイルの名前や拡張子を抜き出す方法」について書いています。

Rustは使えるようになりたいと勉強中ですが、覚えたつもりなのにすぐ忘れたりいざコーディングの時に使い方が分からなかったりするので、自分なりにまとめて記事にしてみようと思ったのがきっかけです。

Rustでファイルパスの一部分だけ(拡張子だけ、とか、名前だけ、とかです)の時に「あれ、どうやるんだったっけ?」となることがよくあるので今回の記事を書きました。

自分に向けた備忘録の意味もありますが、「Rustでファイルの名前や拡張子を抜き出す方法が分からない」な人の一助になれば嬉しいです。

要点だけ

  • 拡張子が欲しい -> extension()
  • ファイル名+拡張子が欲しい -> file_name()
  • ファイル名だけが欲しい -> file_stem()
  • ファイルがあるディレクトリのパスが欲しい -> parent()

前提(環境)

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

方法

ファイルパスから一部分を抽出する場合は、一度PathBuf::from()でPathBuf型に変換します。

PathBufに変換した後に抽出したい部分によって使う関数が少し変わってきます。

拡張子が欲しい

extension()関数を使うことで拡張子の部分を抽出することができます。

ファイル名+拡張子が欲しい

file_name()関数を使うことでファイル名+拡張子の部分を抽出することができます。

ファイル名"だけ"が欲しい

file_stem()関数を使うことでファイル名だけ(拡張子無し)の部分を抽出することができます。

ファイルがあるディレクトリのパスが欲しい

parent()関数を使うことでファイルがあるディレクトリのパスの部分を抽出することができます。

コード例

実際にコード例を見ましょう。

textに仮のファイルパスが格納されており、各部分を抽出しております。

なお、String型に変形するために上で書いた関数の後に少し処理を加えております。

use std::path::PathBuf;

fn main() {
    let text: String = r"C:\Users\xxx\sample\alpha.txt".to_string();

    println!("{}", text); // C:\Users\xxx\sample\alpha.txt

    let text_pathbuf = PathBuf::from(text);

    let ext_string = text_pathbuf
        .extension()
        .unwrap()
        .to_string_lossy()
        .into_owned();
    println!("{}", ext_string); // txt

    let filename_string = text_pathbuf
        .file_name()
        .unwrap()
        .to_string_lossy()
        .into_owned();

    println!("{}", filename_string); // alpha.txt

    let filestem_string = text_pathbuf
        .file_stem()
        .unwrap()
        .to_string_lossy()
        .into_owned();

    println!("{}", filestem_string); // alpha

    let parent_string = text_pathbuf
        .parent()
        .unwrap()
        .to_string_lossy()
        .into_owned();

    println!("{}", parent_string); // C:\Users\xxx\sample
}

おわりに

「Rustでファイルの名前や拡張子を抜き出す方法」について解説しました。

「この部分だけが欲しいんだけど、どう書くんだったっけ?」という時に参考にしていただければと思います。

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

doc.rust-lang.org