ここでは、フォルダ名(ディレクトリ名)とファイル名(あるいは、サブフォルダ名)を結合して、パスを作成する方法を紹介します。具体的に言えば、例えば「C:\dir」というフォルダにある「file.txt」というファイルの絶対パス(フルパス)「C:\dir\file.txt」を取得する時などに利用できる方法です。
なお相対パスから絶対パスを取得する方法は、「相対パスから絶対パスを取得する」で説明しています。
定番なのが、Path.Combineメソッドを使った方法です。このメソッドを使えば、フォルダ名の後ろが「\」で終わっているかを考慮して、適切に結合してくれます。
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.CombinePathメソッドでも同じことができます。
以下に例を示します。フォルダ名の後ろに「\」があってもなくても同じ結果になることに注目してください。
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
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つ以上のパスを結合することもできます。
'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
//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メソッドの注意点を挙げます。
「C:」と「file.txt」をPath.Combineメソッドで結合させると、「C:file.txt」になります。これは、Path.Combineメソッドが、フォルダ名の最後が「\」か「:」か「/」で終わっている時は「\」を付けずに結合するためです。
補足:正確に言えば、「\」か「:」か「/」ではなく、PathクラスのDirectorySeparatorChar、VolumeSeparatorChar、AltDirectorySeparatorCharフィールドで定義された文字です。
' C:file.txt;
Console.WriteLine(System.IO.Path.Combine("C:", "file.txt"))
Console.WriteLine(System.IO.Path.Combine("C:", "file.txt"));
// C:file.txt
Path.Combineメソッドの2番目以降の引数が絶対パスである(ルートが含まれている)場合は、それ以前のパスを無視して、それ以降のパスを結合した結果が返されます。例えば、1番目の引数が「C:\dir1」で、2番目の引数が「D:\dir2」の場合は、「D:\dir2」が返されます。
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
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」が返されます。
Console.WriteLine(System.IO.Path.Combine("C:\dir1", "\dir2")) ' \dir2 Console.WriteLine(System.IO.Path.Combine("C:\dir1", "\dir2", "file.txt")) ' \dir2\file.txt
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番目の引数がそのまま返されます。
Console.WriteLine(System.IO.Path.Combine("C:\dir1", "")) ' C:\dir1 Console.WriteLine(System.IO.Path.Combine("C:\dir1\", "")) ' C:\dir1\
Console.WriteLine(System.IO.Path.Combine(@"C:\dir1", "")); // C:\dir1 Console.WriteLine(System.IO.Path.Combine(@"C:\dir1\", "")); // C:\dir1\
上記のように、Path.Combineメソッドは意外と多機能です。この多機能がかえって邪魔であれば、単純に文字列として連結するだけの方が良いかもしれません。
以下の例では、かなり乱暴ですが、1番目のパスの最後に付いている「\」と、2番目の先頭に付いている「\」をすべて削除してから、何も考えずに両者を「\」でつなげています。
''' <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
/// <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; }