C#で絶対パスから相対パスに変換するときに、Uriクラスを使って
var dir = new Uri(@"C:\aaa\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
string rel = dir.MakeRelativeUri(new Uri(absPath)).ToString();
// rel = ccc/a.txt
というようなことをよくやるのですが、気になったことがあったので確認してみました:
- 大文字小文字の区別
- 正規化
(動作確認環境: Windows 10 .NET Framework 4.7.1)
大文字小文字の区別
var dir = new Uri(@"C:\Aaa\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
結果はccc/a.txtを変化ありませんでした。
Windowsということで、大文字小文字の区別はしないということでしょうか。
正規化
var dir = new Uri(@"C:\Aaa\bbb\..\bbb\");
string absPath = @"C:\aaa\bbb\ccc\a.txt";
System.Console.WriteLine(dir.ToString());
// file:///C:/aaa/bbb/
System.Console.WriteLine(
dir.MakeRelativeUri(new Uri(absPath)).ToString());
// ccc/a.txt
Uriを生成した時点で正規化されるようです。