【C#】ファイルのフルパスから情報を取得する

2021年4月9日

こんにちは、ノムノムです。

今回はファイルのパスについていろいろやっていこうと思います。

パスっていうのはフォルダを開いた時に表示されているファイルが置いてある場所を指します。

今回は、このファイルパスを使った便利な関数を紹介しようと思います。

ファイルの存在チェック

ファイルを扱う上で、当然のように必要になるのがファイル存在チェックです。

取得したファイルパスに本当にファイルがあるかチェックしなければ、ファイルがなかった場合にエラーになってしまいます。必ずファイルを読込むなどファイル操作をする前はチェックする癖をつけましょう。

System.IO.File.Exists 関数

ファイルの存在を真偽(True/False)で返します。

  • ファイルが存在する場合、Trueを返します。
  • ファイルが存在しない場合、Falseを返します。

サンプル

private bool IsFileExist(string file)
{
    //ファイルの存在チェック
    return System.IO.File.Exists(file);          
}

実行結果

ファイル名の取得

ファイルのフルパスからファイル名を抜き出したい時に使います。

昔は文字列の後ろから一文字ずつチェックし、最初の¥マークまでの文字を切り取って使ってましたが、最近は便利な関数が用意されてて楽です。

System.IO.Path.GetFileName 関数

ファイルのフルパスからファイル名だけを抜き出します。

サンプル

private string GetFileNameFromFullPath(string file)
{
    //ファイル名を取得
    return System.IO.Path.GetFileName(file);
}

実行結果

拡張子なしでファイル名を取得するには

拡張子を使わない場合は、以下のようにします。

private string GetFileNameWithoutExtFromFullPath(string file)
{
    //ファイル名(拡張子)を取得
    return System.IO.Path.GetFileNameWithoutExtension(file);
}

実行結果

ファイルのあるフォルダを取得

ファイルのあるフォルダを取得したい時に使います。
例えば開いたファイルと同じ場所に違うファイルを出力したい時に必要になると思います。

System.IO.Path.GetDirectoryName 関数

ファイルのフルパスからファイル名を除いた文字列を返します。

サンプル

private string GetDirectoryFromFullPath(string file)
{
    //ファイルのあるフォルダを取得
    return System.IO.Path.GetDirectoryName(file);
}

実行結果

ファイルのルートパスを取得する

ファイルがどこのドライブにあるか取得したい時に使えます。

System.IO.Path.GetPathRoot 関数

ファイルのフルパスからルートパスを取得します。

サンプル

private string GetRootPathFromFullPath(string file)
{
    //ファイルのルートパスを取得
    return System.IO.Path.GetPathRoot(file);
}

実行結果

拡張子の取得

選択しているファイルの拡張子が分かれば画像ファイルか動画ファイルかわかります。

ファイルを開くときにファイルの拡張子でエラーとしたり、読込処理を分岐したりして使えます。

ただし、元々EXEファイルだったものをTXTファイルに拡張子を変更したものを、この関数を使ってEXEファイルとして取得するみたいなことはできません。

System.IO.Path.GetExtension 関数

ファイルのフルパスから拡張子だけ取り出します。

サンプル

private string GetExtensionFromFullPath(string file)
{
    //ファイルの拡張子を取得
    return System.IO.Path.GetExtension(file);
}

実行結果

まとめ

ファイルパスを自分で文字列関数を使って切ることもできますが、こういう便利な関数が予め用意されているので、時間短縮を考え使えるものは使っていく方針でいきましょう。

直接これらの関数を呼び出すよりも私はなるべくサンプルのように関数を作成してその中で呼び出すようにしています。

その理由は、仮に処理を追加したくなった時に、関数にしておけば1か所直すだけで済むからです。

例えば、ファイルパスからファイル名だけ取得するとします。でもその前にファイルが存在していることをチェックするようにしたいとします。

もしGetFileName関数を30個近く使っていればそのすべてを直さなければいけません。
上記のサンプルのように関数化したものを使っていれば1か所直すだけで30か所すべてに対応できるということです。

いきなり修正もしない完璧なアプリなど作れませんから、プログラムの改修作業は結構あります。
可読性も大事ですがメンテナンスしやすい作りにするのも重要です。

ここまで読んで頂いてありがとうございます。