RustでString型のファイルパスからString型の拡張子などを取得する

はじめに

この記事では、「RustでString型のファイルパスからString型の拡張子などを取得する方法」について書いています。

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

書く内容についてですが、Rustでファイルパスの拡張子の部分、もしくはファイル名の部分だけをString型で欲しい、という時にどうやるかという方法で、PathBuf型にして欲しい部分を取得しまたString型に戻す、というのは覚えてても細かくどう処理していいか時間が経つとすぐ忘れてしまうので書きました。

自分に向けた備忘録の意味もありますが、「Rustでファイルパスをどう扱えば良いのか分からない」な人の一助になれば嬉しいです。

要点だけ

    let ext_string = PathBuf::from(text)
        .extension() // 取得したいものに応じてfile_nameなどに変えてください
        .unwrap()
        .to_string_lossy()
        .into_owned();

前提(環境)

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

方法

方針としては

  1. String型からPathBuf型に変換する
  2. 欲しい部分を抽出する
  3. String型に変換する

という手順になります。

1.と2.は良いんですが3.が意外にいくつか処理を介さないといけないのが厄介な部分です。

コードは以下の通りです。

use std::path::PathBuf;

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

    println!("{}", text);

    // PathBufに変換する
    let text_pathbuf = PathBuf::from(text);

    // Option型で返ってくる
    let ext_option = text_pathbuf.extension();

    // Optionを剥がしたものは&OsStr型になっている
    let ext_osstr = ext_option.unwrap();

    // to_string_lossy()でCow<str>型にする
    let ext_cowstr = ext_osstr.to_string_lossy();

    // into_owned()でString型にする
    let ext_string = ext_cowstr.into_owned();

    println!("{}", ext_string);
}

どんな型を経由してるかはコメントに書いてますので参照ください

なお、上記を一つの処理としてまとめて書く場合は以下のようになります。

use std::path::PathBuf;

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

    println!("{}", text);

    let ext_string = PathBuf::from(text)
        .extension() // 取得したいものに応じてfile_nameなどに変えてください
        .unwrap()
        .to_string_lossy()
        .into_owned();

    println!("{}", ext_string);
}

おわりに

「RustでString型のファイルパスからString型の拡張子などを取得する方法」について解説しました。

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

zenn.dev