コマンドライン引数や設定ファイルで「相対パス(例:..\Data\input.csv)」が指定された際、プログラム内部ではファイルの場所を特定するために「絶対パス(フルパス)」に変換したい場合があります。
Path.GetFullPath メソッドを使用すると、現在のカレントディレクトリを基準として、相対パスを完全な絶対パスに解決・変換できます。
目次
絶対パス変換の実装例
以下のサンプルコードでは、カレントディレクトリ(プログラムの実行場所)を基準に、一つ上の階層にあるデータファイルのパスを絶対パスとして取得しています。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 1. 変換前の相対パス
// ".." は「一つ上の親ディレクトリ」を意味します
string relativePath = @"..\Assets\texture.png";
// (参考) 現在のカレントディレクトリを表示
// この場所を基準にパスが計算されます
string currentDir = Directory.GetCurrentDirectory();
Console.WriteLine($"カレントディレクトリ: {currentDir}");
Console.WriteLine($"指定した相対パス : {relativePath}\n");
// 2. 相対パスを絶対パスに変換
// Path.GetFullPath は、カレントディレクトリと相対パスを結合し、
// ".." などを解決してきれいなパスにします
string absolutePath = Path.GetFullPath(relativePath);
Console.WriteLine("--- 変換結果 ---");
Console.WriteLine($"絶対パス: {absolutePath}");
}
}
実行結果(例:C:\Work\MyApp\Bin で実行した場合)
カレントディレクトリ: C:\Work\MyApp\Bin
指定した相対パス : ..\Assets\texture.png
--- 変換結果 ---
絶対パス: C:\Work\MyApp\Assets\texture.png
解説と技術的なポイント
1. 基準となる場所(カレントディレクトリ)
Path.GetFullPath は、Environment.CurrentDirectory(カレントディレクトリ) を基準としてパスを解決します。 そのため、同じプログラムでも、コマンドプロンプトでどこから起動したかによって、変換結果が変わる可能性がある点に注意が必要です。
2. “..” や “.” の解決
単に文字列を結合するだけでなく、パスに含まれる特別な記号も解決されます。
..(親ディレクトリ):ディレクトリを一つ遡ってパスを短縮します。.(カレントディレクトリ):無視されて削除されます。
3. ファイルの存在有無
このメソッドは、対象のファイルが実際に存在するかどうかは確認しません。あくまでパスの文字列としての整合性を保ちながら計算を行うだけです。 変換後のパスにファイルがあるか確認したい場合は、続けて File.Exists(absolutePath) を使用してください。
