問題 §
C#でファイルのパスをURIに変換する方法が上手く機能しないケースがある。
再現コード §
using System;
class Program
{
static void Main(string[] args)
{
var uri = new Uri(@"C:\###\b c%20.txt");
Console.WriteLine(uri.AbsoluteUri);
var uri2 = new Uri(@"C:\あ\b c%20.txt");
Console.WriteLine(uri2.AbsoluteUri);
}
}
.NET F/ W4までの実行結果 (期待通り) §
file:///C:/%23%23%23/b%20c%2520.txt
file:///C:/%E3%81%82/b%20c%2520.txt
.NET F / W 4.5以降での実行結果 (2つめは期待に反する) §
file:///C:/%23%23%23/b%20c%2520.txt
file:///C:/%E3%81%82/b%20c%20.txt
回避コード例 (%を別の文字に一時的に置き換えて処理させない) §
var uri = new Uri(filename.Replace("%", "*"));
return new Uri(uri.AbsoluteUri.Replace("*", "%25"));
参考URI §
https://developercommunity.visualstudio.com/content/problem/89895/uri-constructor-not-encode-character-after-net-45.html