ディレクトリ名とファイル名、親ディレクトリと子ディレクトリなど、個別の部分(断片)からなるパスを結合して一つのパスにするにはCombineメソッドを使います。
Combineメソッドでは、絶対パスと相対パスとの結合や、相対パス同士の結合を行うことができます。 引数に指定されたパスは実行環境のディレクトリ区切り文字にしたがって解釈され、結合時には必要に応じて区切り文字が自動的に補われます。 特に非Windows環境での\
は、区切りではなくディレクトリ名・ファイル名の一部として解釈された上で結合される点に注意が必要です。 また、パス内に含まれる".
"や"..
"は、正規化されずそのまま結合されます。 (パスの正規化を行うにはGetFullPathメソッドを使用します)
このメソッドでは、2つ以上の要素からなる任意個のパスを結合できます。 複数の文字列、あるいは文字列の配列として渡すことができる一方で、(少なくとも.NET 5までの時点では)IEnumerable<String>
を直接渡すことはできないため、ToArrayメソッドで配列に変換する必要があります。
Path.Combineメソッドでパスを結合する
using System;
using System.Collections.Generic;
using System.IO;
class Sample {
static void Main()
{
// Path.Combineメソッドでパスを結合する
Console.WriteLine(Path.Combine(@"E:\dir\", "file.txt")); // 絶対パスのディレクトリとファイル名を結合する
Console.WriteLine(Path.Combine(@"E:\dir", "file.txt")); // 区切り文字で終わっていない絶対パスとファイル名を結合する (結果は上と同じ)
Console.WriteLine(Path.Combine(@"E:\dir\", "subdir", "file.txt")); // 絶対パスのディレクトリと、サブディレクトリ名、ファイル名を結合する
Console.WriteLine(Path.Combine(@"E:\dir\", @"subdir\file.txt")); // 絶対パスのディレクトリと相対パスを結合する (結果は上と同じ)
Console.WriteLine(Path.Combine(@"E:\dir\", @"..\file.txt")); // ".."(親ディレクトリ)を含む相対パスを結合する (正規化はされない)
Console.WriteLine(Path.Combine(@"dir\subdir", @".\file.txt")); // "."(カレントディレクトリ)を含む相対パス同士を結合する (正規化はされない)
Console.WriteLine(Path.Combine("/dir", "subdir", "file.txt")); // UNIX形式のルートディレクトリ、ディレクトリ名、ファイル名を結合する
Console.WriteLine(Path.Combine("/dir", "../subdir", "./file.txt")); // UNIX形式の相対パスを結合する
Console.WriteLine();
// Listに格納されたパスの断片
var pathFragments = new List<string>() {"path", "to", "some", "file", "or", "directory"};
// string[]を指定することはできるが、IEnumerable<string>は指定できないので
// Listなどを指定したい場合は、いったん配列に変換する必要がある
//Console.WriteLine(Path.Combine(pathFragments)); // error CS1503: 引数 1: は 'System.Collections.Generic.List<string>' から 'string' へ変換することはできません。
Console.WriteLine(Path.Combine(pathFragments.ToArray()));
}
}
実行結果
E:\dir\file.txt E:\dir\file.txt E:\dir\subdir\file.txt E:\dir\subdir\file.txt E:\dir\..\file.txt dir\subdir\.\file.txt /dir\subdir\file.txt /dir\../subdir\./file.txt path\to\some\file\or\directory
実行結果
E:\dir\/file.txt E:\dir/file.txt E:\dir\/subdir/file.txt E:\dir\/subdir\file.txt E:\dir\/..\file.txt dir\subdir/.\file.txt /dir/subdir/file.txt /dir/../subdir/./file.txt path/to/some/file/or/directory
Combineメソッドでは、引数に対してパスとして正しい形式となるような選択が行われます。 具体的には、引数リストにルートディレクトリからのパス(Path.IsPathRootedがtrueとなるパス)が指定されている場合、そのうちの一番最後をルートディレクトリとして選択した上でパスの結合を行います。 それより前のパスは結合に際して用いられず、無視されます。
ルートディレクトリからのパスかどうかの解釈は行わず、単にパス同士を連結させたい場合はPath.Joinメソッドを使用します。