.NET Framework には、パス (例: "C:\whatever.txt"
) をファイル URI (例: ) に変換する方法はあります"file:///C:/whatever.txt"
か?
System.Uriクラスには(ファイル URI から絶対パスへの) 逆がありますが、ファイル URI への変換については、私が見つけることができる限り何もありません。
また、これはASP.NET アプリケーションではありません。
.NET Framework には、パス (例: "C:\whatever.txt"
) をファイル URI (例: ) に変換する方法はあります"file:///C:/whatever.txt"
か?
System.Uriクラスには(ファイル URI から絶対パスへの) 逆がありますが、ファイル URI への変換については、私が見つけることができる限り何もありません。
また、これはASP.NET アプリケーションではありません。
コンストラクターには、System.Uri
完全なファイル パスを解析し、それらを URI スタイルのパスに変換する機能があります。したがって、次のことができます。
var uri = new System.Uri("c:\\foo");
var converted = uri.AbsoluteUri;
誰も気付いていないように見えるのは、どのSystem.Uri
コンストラクターも、パーセント記号を含む特定のパスを正しく処理できないということです。
new Uri(@"C:\%51.txt").AbsoluteUri;
これにより、"file:///C:/Q.txt"
代わりに が得られます"file:///C:/%2551.txt"
。
非推奨の dontEscape 引数のどちらの値も違いはなく、UriKind を指定しても同じ結果が得られます。UriBuilder を試しても役に立ちません。
new UriBuilder() { Scheme = Uri.UriSchemeFile, Host = "", Path = @"C:\%51.txt" }.Uri.AbsoluteUri
これも返します"file:///C:/Q.txt"
。
私が知る限り、フレームワークにはこれを正しく行う方法が実際にはありません。
バックスラッシュをスラッシュに置き換えてパスをフィードすることで、それを試すことができますUri.EscapeUriString
-つまり
new Uri(Uri.EscapeUriString(filePath.Replace(Path.DirectorySeparatorChar, '/'))).AbsoluteUri
これは最初は機能しているように見えますが、パスC:\a b.txt
を指定すると、file:///C:/a%2520b.txt
代わりにfile:///C:/a%20b.txt
- という結果になります。どういうわけか、一部のシーケンスはデコードする必要があるが、他のシーケンスはデコードしない必要があると判断します。これで自分自身のプレフィックスを付けることができます"file:///"
が、これは UNC パスのようなもの\\remote\share\foo.txt
を考慮に入れることができません。Windows で一般的に受け入れられているように見えるのは、形式の疑似 URL に変換するfile://remote/share/foo.txt
ことです。そのため、それも考慮する必要があります。
EscapeUriString
文字をエスケープしないという問題もあり'#'
ます。この時点では、独自の方法をゼロから作成するしかないように思われます。だからこれは私が提案するものです:
public static string FilePathToFileUrl(string filePath)
{
StringBuilder uri = new StringBuilder();
foreach (char v in filePath)
{
if ((v >= 'a' && v <= 'z') || (v >= 'A' && v <= 'Z') || (v >= '0' && v <= '9') ||
v == '+' || v == '/' || v == ':' || v == '.' || v == '-' || v == '_' || v == '~' ||
v > '\xFF')
{
uri.Append(v);
}
else if (v == Path.DirectorySeparatorChar || v == Path.AltDirectorySeparatorChar)
{
uri.Append('/');
}
else
{
uri.Append(String.Format("%{0:X2}", (int)v));
}
}
if (uri.Length >= 2 && uri[0] == '/' && uri[1] == '/') // UNC path
uri.Insert(0, "file:");
else
uri.Insert(0, "file:///");
return uri.ToString();
}
これは意図的に + と : をエンコードしないままにしておきます。これは、Windows で通常行われている方法と思われるためです。また、エンコードされている場合、Internet Explorer はファイル URL の Unicode 文字を理解できないため、latin1 のみをエンコードします。
VB.NET:
Dim URI As New Uri("D:\Development\~AppFolder\Att\1.gif")
異なる出力:
URI.AbsolutePath -> D:/Development/~AppFolder/Att/1.gif
URI.AbsoluteUri -> file:///D:/Development/~AppFolder/Att/1.gif
URI.OriginalString -> D:\Development\~AppFolder\Att\1.gif
URI.ToString -> file:///D:/Development/~AppFolder/Att/1.gif
URI.LocalPath -> D:\Development\~AppFolder\Att\1.gif
一発ギャグ:
New Uri("D:\Development\~AppFolder\Att\1.gif").AbsoluteUri
出力:
file:///D:/Development/~AppFolder/Att/1.gif