問題 §
Path.GetDirectoryNameがnullを返したり長さ0の文字列を返したり予想もしない挙動を示すことがあって悩む。
原因 §
仕様。
対策 §
以下のテストプログラムの結果を参考に面倒臭い使い方はできるだけしない。
テストプログラム(.NET Framework 4.7.2) §
using System;
using System.IO;
class Program
{
static void sub(string path)
{
Console.Write($"Path.GetDirectoryName(\"{path}\") => ");
var d = Path.GetDirectoryName(path);
if (d == null) Console.WriteLine("null");
else if (d.Length == 0) Console.WriteLine("zero length string");
else Console.WriteLine(d);
}
static void Main()
{
sub(@"a:\x.txt");
sub(@"a\x.txt");
sub(@"\x.txt");
sub(@"x.txt");
sub(@"a:\");
sub(@"a:");
sub(@"\\.\device");
sub(@"\\.\device\test.txt");
sub(@"\\host\share");
sub(@"\\host\share\test.txt");
}
}
実行結果 §
Path.GetDirectoryName("a:\x.txt") => a:\
Path.GetDirectoryName("a\x.txt") => a
Path.GetDirectoryName("\x.txt") => \
Path.GetDirectoryName("x.txt") => zero length string
Path.GetDirectoryName("a:\") => null
Path.GetDirectoryName("a:") => null
Path.GetDirectoryName("\\.\device") => null
Path.GetDirectoryName("\\.\device\test.txt") => \\.\device
Path.GetDirectoryName("\\host\share") => null
Path.GetDirectoryName("\\host\share\test.txt") => \\host\share