パスの末尾がディレクトリ区切り文字となっているかどうかを調べるにはEndsInDirectorySeparatorメソッドを使うことができます。 また、ディレクトリ区切り文字で終端されているパスから終端のディレクトリ区切り文字をトリミングするにはTrimEndingDirectorySeparatorメソッドを使うことができます。
EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドは、ディレクトリを表すパスの場合は末尾が\
あるいは/
となっていることを要求したい場合、逆にパスがファイルでもディレクトリでも同一の表記で扱いたい場合などに用いることができます。
TrimEndingDirectorySeparatorメソッドは、E:\
,\
,/
などルートディレクトリを表すパスの場合は終端のトリミングは行いません。 そのため、このメソッドを使ってドライブ名(E:
)のみを取得することはできません。
なお、EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドは.NET Standard 2.1/.NET Core 2.1以降で使用できます。
EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドが使用できない場合は、DirectorySeparatorChar・AltDirectorySeparatorCharフィールドとString.EndsWithメソッド・String.TrimEndメソッドを組み合わせることで同様の処理を行うことができます。
String.TrimEnd/EndsWithメソッドを使ってパス末尾のディレクトリ区切り文字を除去する/パス末尾がディレクトリ区切り文字かどうか調べる
using System;
using System.IO;
class Sample {
static void Main()
{
foreach (var path in new[] {
// ディレクトリパス (Windows形式)
@"E:\dir\subdir\",
@"E:\dir\subdir",
@"E:\",
@"\",
@"dir\subdir\",
@"dir\subdir",
// ディレクトリパス (Unix形式)
@"/",
@"/dir/subdir/",
@"/dir/subdir",
@"dir/subdir/",
@"dir/subdir",
}) {
Console.WriteLine("path = {0}", path);
// パスがディレクトリ区切り文字で終わるかどうか調べる
// (Path.EndsInDirectorySeparatorメソッド相当の処理)
Console.WriteLine("dir separator? {0}", path.EndsWith(Path.DirectorySeparatorChar) || path.EndsWith(Path.AltDirectorySeparatorChar));
// パス末尾のディレクトリ区切り文字を除去する
// (Path.TrimEndingDirectorySeparatorメソッド相当の処理、ただし
// この実装ではルートディレクトリを表すパスの場合も末尾の区切り文字が
// 削除されてしまうため、別途対処が必要となる)
Console.WriteLine("trimmed path = {0}", path.TrimEnd(new[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}));
Console.WriteLine();
}
}
}
実行結果
path = E:\dir\subdir\ dir separator? True trimmed path = E:\dir\subdir path = E:\dir\subdir dir separator? False trimmed path = E:\dir\subdir path = E:\ dir separator? True trimmed path = E: path = \ dir separator? True trimmed path = path = dir\subdir\ dir separator? True trimmed path = dir\subdir path = dir\subdir dir separator? False trimmed path = dir\subdir path = / dir separator? True trimmed path = path = /dir/subdir/ dir separator? True trimmed path = /dir/subdir path = /dir/subdir dir separator? False trimmed path = /dir/subdir path = dir/subdir/ dir separator? True trimmed path = dir/subdir path = dir/subdir dir separator? False trimmed path = dir/subdir
実行結果
path = E:\dir\subdir\ dir separator? False trimmed path = E:\dir\subdir\ path = E:\dir\subdir dir separator? False trimmed path = E:\dir\subdir path = E:\ dir separator? False trimmed path = E:\ path = \ dir separator? False trimmed path = \ path = dir\subdir\ dir separator? False trimmed path = dir\subdir\ path = dir\subdir dir separator? False trimmed path = dir\subdir path = / dir separator? True trimmed path = path = /dir/subdir/ dir separator? True trimmed path = /dir/subdir path = /dir/subdir dir separator? False trimmed path = /dir/subdir path = dir/subdir/ dir separator? True trimmed path = dir/subdir path = dir/subdir dir separator? False trimmed path = dir/subdir