DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォルダ名とファイル名を結合して絶対パスを作成する

ここでは、フォルダ名(ディレクトリ名)とファイル名(あるいは、サブフォルダ名)を結合して、パスを作成する方法を紹介します。具体的に言えば、例えば「C:\dir」というフォルダにある「file.txt」というファイルの絶対パス(フルパス)「C:\dir\file.txt」を取得する時などに利用できる方法です。

なお相対パスから絶対パスを取得する方法は、「相対パスから絶対パスを取得する」で説明しています。

Path.Combineメソッドを使用する

定番なのが、Path.Combineメソッドを使った方法です。このメソッドを使えば、フォルダ名の後ろが「\」で終わっているかを考慮して、適切に結合してくれます。

補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.CombinePathメソッドでも同じことができます。

以下に例を示します。フォルダ名の後ろに「\」があってもなくても同じ結果になることに注目してください。

VB.NET
コードを隠すコードを選択
Dim basePath As String = "C:\dir"
Dim filePath As String = "file.txt"

'2つのパスを結合する
Dim absolutePath As String = System.IO.Path.Combine(basePath, filePath)
'結果を表示する
Console.WriteLine(absolutePath)
' C:\dir\file.txt

'フォルダ名の後ろに"\"を付けてみる
basePath = basePath & "\"
'2つのパスを結合する
absolutePath = System.IO.Path.Combine(basePath, filePath)
'結果を表示する
Console.WriteLine(absolutePath)
' C:\dir\file.txt
C#
コードを隠すコードを選択
string basePath = "C:\\dir";
string filePath = "file.txt";

//2つのパスを結合する
string absolutePath = System.IO.Path.Combine(basePath, filePath);
//結果を表示する
Console.WriteLine(absolutePath);
// C:\dir\file.txt

//フォルダ名の後ろに"\"を付けてみる
basePath = basePath + "\\";
//2つのパスを結合する
absolutePath = System.IO.Path.Combine(basePath, filePath);
//結果を表示する
Console.WriteLine(absolutePath);
// C:\dir\file.txt

.NET Framework 4.0からは、Path.Combineメソッドで3つ以上のパスを結合することもできます。

VB.NET
コードを隠すコードを選択
'2つのパスを結合する
Console.WriteLine( _
    System.IO.Path.Combine("C:\a\b", "c\file.txt"))
'C:\a\b\c\file.txt

'3つのパスを結合する
Console.WriteLine( _
    System.IO.Path.Combine("C:\a", "b", "c\file.txt"))
'C:\a\b\c\file.txt

'4つのパスを結合する
Console.WriteLine( _
    System.IO.Path.Combine("C:\a", "b", "c", "file.txt"))
'C:\a\b\c\file.txt

'5つのパスを結合する
Console.WriteLine( _
    System.IO.Path.Combine( _
        New String() {"C:\", "a", "b", "c", "file.txt"}))
'C:\a\b\c\file.txt
C#
コードを隠すコードを選択
//2つのパスを結合する
Console.WriteLine(
    System.IO.Path.Combine(@"C:\a\b", @"c\file.txt"));
//C:\a\b\c\file.txt

//3つのパスを結合する
Console.WriteLine(
    System.IO.Path.Combine(@"C:\a", "b", @"c\file.txt"));
//C:\a\b\c\file.txt

//4つのパスを結合する
Console.WriteLine(
    System.IO.Path.Combine(@"C:\a", "b", "c", "file.txt"));
//C:\a\b\c\file.txt

//5つのパスを結合する
Console.WriteLine(
    System.IO.Path.Combine(
        new string[] { @"C:\", "a", "b", "c", "file.txt" }));
//C:\a\b\c\file.txt

Path.Combineメソッドの注意点

Path.Combineメソッドはとてもよく知られたメソッドですが、実はその動作は意外と複雑で、そのことを知らないと思った結果にならないことがあります。以下にPath.Combineメソッドの注意点を挙げます。

フォルダ名が「:」で終わる時は、「\」が付かない

「C:」と「file.txt」をPath.Combineメソッドで結合させると、「C:file.txt」になります。これは、Path.Combineメソッドが、フォルダ名の最後が「\」か「:」か「/」で終わっている時は「\」を付けずに結合するためです。

補足:正確に言えば、「\」か「:」か「/」ではなく、PathクラスのDirectorySeparatorChar、VolumeSeparatorChar、AltDirectorySeparatorCharフィールドで定義された文字です。
VB.NET
コードを隠すコードを選択
' C:file.txt;
Console.WriteLine(System.IO.Path.Combine("C:", "file.txt"))
C#
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine("C:", "file.txt"));
// C:file.txt

ファイル名が絶対パスの時は、その絶対パスが返される

Path.Combineメソッドの2番目以降の引数が絶対パスである(ルートが含まれている)場合は、それ以前のパスを無視して、それ以降のパスを結合した結果が返されます。例えば、1番目の引数が「C:\dir1」で、2番目の引数が「D:\dir2」の場合は、「D:\dir2」が返されます。

VB.NET
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine("C:\dir1", "D:\dir2"))
' D:\dir2

Console.WriteLine(System.IO.Path.Combine("C:\dir1", "D:\dir2", "file.txt"))
' D:\dir2\file.txt
C#
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", @"D:\dir2"));
// D:\dir2

Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", @"D:\dir2", "file.txt"));
// D:\dir2\file.txt

ファイル名が「\」で始まる時は、その文字列がそのまま返される

「\」で始まるパスは、ルートを含んだパスと解釈されるようです。そのため、先ほどのルールが適用され、Path.Combineメソッドは「\」で始まる引数以降の引数を結合した結果を返します。例えば、1番目の引数が「C:\dir1」で、2番目の引数が「\file.txt」の場合は、「\file.txt」が返されます。

VB.NET
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine("C:\dir1", "\dir2"))
' \dir2

Console.WriteLine(System.IO.Path.Combine("C:\dir1", "\dir2", "file.txt"))
' \dir2\file.txt
C#
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", @"\dir2"));
// \dir2

Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", @"\dir2", "file.txt"));
// \dir2\file.txt

ファイル名が空白の時は、フォルダ名がそのまま返される

Path.Combineメソッドの2番目の引数が空白文字列の場合、1番目の引数の最後に「\」が付いているかいないかにかかわらず、1番目の引数がそのまま返されます。

VB.NET
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine("C:\dir1", ""))
' C:\dir1

Console.WriteLine(System.IO.Path.Combine("C:\dir1\", ""))
' C:\dir1\
C#
コードを隠すコードを選択
Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", ""));
// C:\dir1

Console.WriteLine(System.IO.Path.Combine(@"C:\dir1\", ""));
// C:\dir1\

単純に文字列として連結する

上記のように、Path.Combineメソッドは意外と多機能です。この多機能がかえって邪魔であれば、単純に文字列として連結するだけの方が良いかもしれません。

以下の例では、かなり乱暴ですが、1番目のパスの最後に付いている「\」と、2番目の先頭に付いている「\」をすべて削除してから、何も考えずに両者を「\」でつなげています。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 2つの文字列を"\"で連結して、1つのパスに結合します。
''' </summary>
''' <param name="path1">1番目のパス。</param>
''' <param name="path2">2番目のパス。</param>
''' <returns>結合されたパス。</returns>
Public Shared Function CombinePaths(path1 As String, path2 As String) As String
    'path1のおしりに付いている"\"を削除する
    path1 = path1.TrimEnd(System.IO.Path.DirectorySeparatorChar)
    'path2の頭に付いている"\"を削除する
    path2 = path2.TrimStart(System.IO.Path.DirectorySeparatorChar)
    '2つのパスを"\"で連結する
    Return path1 & System.IO.Path.DirectorySeparatorChar & path2
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 2つの文字列を"\"で連結して、1つのパスに結合します。
/// </summary>
/// <param name="path1">1番目のパス。</param>
/// <param name="path2">2番目のパス。</param>
/// <returns>結合されたパス。</returns>
public static string CombinePaths(string path1, string path2)
{
    //path1のおしりに付いている"\"を削除する
    path1 = path1.TrimEnd(System.IO.Path.DirectorySeparatorChar);
    //path2の頭に付いている"\"を削除する
    path2 = path2.TrimStart(System.IO.Path.DirectorySeparatorChar);
    //2つのパスを"\"で連結する
    return path1 + System.IO.Path.DirectorySeparatorChar + path2;
}
  • 履歴:
  • 2015/11/6 .NET Framework 4.0以降でないと、Path.Combineメソッドで3つ以上のパスを結合できないことを追記。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。