228

.NET Framework には、パス (例: "C:\whatever.txt") をファイル URI (例: ) に変換する方法はあります"file:///C:/whatever.txt"か?

System.Uriクラスには(ファイル URI から絶対パスへの) 逆がありますが、ファイル URI への変換については、私が見つけることができる限り何もありません。

また、これはASP.NET アプリケーションではありません。

4

7 に答える 7

325

コンストラクターには、System.Uri完全なファイル パスを解析し、それらを URI スタイルのパスに変換する機能があります。したがって、次のことができます。

var uri = new System.Uri("c:\\foo");
var converted = uri.AbsoluteUri;
于 2009-10-09T22:45:54.390 に答える
51

誰も気付いていないように見えるのは、どの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 のみをエンコードします。

于 2016-03-01T22:02:55.370 に答える
9

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

于 2014-07-16T22:09:04.183 に答える