ファイルパス文字列(例:C:\MyData\report.pdf)から、「ファイル名だけ欲しい」「拡張子を調べたい」「親フォルダのパスを知りたい」という場合、文字列操作(Substring や IndexOf)を行うのはバグの原因になります。
System.IO.Path クラスには、これらの構成要素を安全かつ正確に抽出するための静的メソッドが用意されています。
目次
パス解析の実装例
以下のサンプルコードでは、Windows形式の絶対パスを想定し、そこからフォルダパス、ファイル名、拡張子などを分解して取得しています。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 解析対象のフルパス(Windows形式の例)
// ※実際にはファイルが存在しなくても、文字列として解析可能です
string filePath = @"D:\Projects\Design\Assets\logo_v2.png";
Console.WriteLine($"元のパス: {filePath}\n");
Console.WriteLine("--- 解析結果 ---");
// 1. ディレクトリ名(親フォルダまでのパス)を取得
// 戻り値: D:\Projects\Design\Assets
string directory = Path.GetDirectoryName(filePath);
Console.WriteLine($"ディレクトリ名 : {directory}");
// 2. ファイル名(拡張子あり)を取得
// 戻り値: logo_v2.png
string fileName = Path.GetFileName(filePath);
Console.WriteLine($"ファイル名 : {fileName}");
// 3. ファイル名(拡張子なし)を取得
// 戻り値: logo_v2
string fileNameNoExt = Path.GetFileNameWithoutExtension(filePath);
Console.WriteLine($"拡張子なし名 : {fileNameNoExt}");
// 4. 拡張子(ドットを含む)を取得
// 戻り値: .png
string extension = Path.GetExtension(filePath);
Console.WriteLine($"拡張子 : {extension}");
// (参考) ルートディレクトリを取得
// 戻り値: D:\
string root = Path.GetPathRoot(filePath);
Console.WriteLine($"ルート : {root}");
}
}
実行結果
元のパス: D:\Projects\Design\Assets\logo_v2.png
--- 解析結果 ---
ディレクトリ名 : D:\Projects\Design\Assets
ファイル名 : logo_v2.png
拡張子なし名 : logo_v2
拡張子 : .png
ルート : D:\
解説と技術的なポイント
1. 文字列としての処理
これらのメソッドは、実際にディスク上にファイルが存在するかどうかを確認するわけではありません。あくまで文字列のパターンに基づいて分解を行います。そのため、存在しないパスや、構築中のパス文字列に対しても問題なく使用できます。
2. Path.GetDirectoryName
ファイルパスから「ファイル名」を取り除いた部分を返します。 注意点として、パスがルートディレクトリ(例:C:\)の場合、null を返すことがあります。
3. Path.GetExtension
拡張子を返す際、必ずドット(.)を含んだ形式(例:.png)で返します。拡張子がないファイルの場合は空文字列 "" を返します。
4. プラットフォームの違い
Windowsパス(\区切り)も、Linux/macOSパス(/区切り)も、実行環境のOSに関わらず Path クラスが適切に処理しようと試みますが、基本的には実行しているOSの標準的な区切り文字に基づいて解析されます。
