ディレクトリ名とファイル名、親ディレクトリと子ディレクトリなど、個別の部分(断片)からなるパスを結合して一つのパスにするにはCombineメソッドを使います。
Combineメソッドでは、絶対パスと相対パスとの結合や、相対パス同士の結合を行うことができます。 引数に指定されたパスは実行環境のディレクトリ区切り文字にしたがって解釈され、結合時には必要に応じて区切り文字が自動的に補われます。 特に非Windows環境での\
は、区切りではなくディレクトリ名・ファイル名の一部として解釈された上で結合される点に注意が必要です。 また、パス内に含まれる".
"や"..
"は、正規化されずそのまま結合されます。 (パスの正規化を行うにはGetFullPathメソッドを使用します)
このメソッドでは、2つ以上の要素からなる任意個のパスを結合できます。 複数の文字列、あるいは文字列の配列として渡すことができる一方で、(少なくとも.NET 5までの時点では)IEnumerable<String>
を直接渡すことはできないため、ToArrayメソッドで配列に変換する必要があります。
Combineメソッドでは、引数に対してパスとして正しい形式となるような選択が行われます。 具体的には、引数リストにルートディレクトリからのパス(Path.IsPathRootedがtrueとなるパス)が指定されている場合、そのうちの一番最後をルートディレクトリとして選択した上でパスの結合を行います。 それより前のパスは結合に際して用いられず、無視されます。
Path.Combineメソッドでは、一番最後のルートディレクトリからのパスとして結合される
Imports System
Imports System.IO
Class Sample
Shared Sub Main()
' Path.Combineメソッドでは、結合結果がルートディレクトリからのパスとして正しい形式となるよう、
' 引数リスト内における一番最後のルートディレクトリからのパスが選択され、それより前のパスは無視される
Console.WriteLine(Path.Combine("E:\", "C:\")) ' (Windowsの場合)"C:\"がルートディレクトリとして選択される
Console.WriteLine(Path.Combine("E:\", "C:\", "file.txt")) ' (Windowsの場合)"C:\"がルートディレクトリとして選択された上で、以降の引数との連結が行われる
Console.WriteLine(Path.Combine("dir\", "C:\", "file.txt")) ' (Windowsの場合)同上、最初の引数は無視される
Console.WriteLine(Path.Combine("E:\", "\dir\file.txt")) ' (Windowsの場合)カレントドライブの"\"がルートディレクトリとして選択されるため、結果として"\dir\file.txt"が返される
Console.WriteLine()
Console.WriteLine(Path.Combine("/root", "/dir")) ' (非Windowsの場合)"/dir"がルートディレクトリとして選択される
Console.WriteLine(Path.Combine("/root", "/dir", "file.txt")) ' (非Windowsの場合)"/dir"がルートディレクトリとして選択された上で、以降の引数との連結が行われる
Console.WriteLine(Path.Combine("dir/", "/dir", "file.txt")) ' (非Windowsの場合)同上、最初の引数は無視される
End Sub
End Class
実行結果
C:\ C:\file.txt C:\file.txt \dir\file.txt /dir /dir\file.txt /dir\file.txt
実行結果
E:\/C:\ E:\/C:\/file.txt dir\/C:\/file.txt E:\/\dir\file.txt /dir /dir/file.txt /dir/file.txt
ルートディレクトリからのパスかどうかの解釈は行わず、単にパス同士を連結させたい場合はPath.Joinメソッドを使用します。