9

後でファイル処理中にパスを解析するには、クエリ パラメーターとしてファイル パスに追加のクエリ情報を追加する必要があります。そのSystem.Uriクラスはこれに役立つと思いますが、ローカル ファイル パスに期待したものは得られないようです。

var fileUri = new Uri("file:///c://a.txt?select=10")
// fileUri.AbsoluteUri = "file:///c://a.txt%3Fselect=10"
// fileUri.Query = ""

var httpUri = new Uri("http://someAddress/a.txt?select=10")
// httpUri.AbsoluteUri = "http://someaddress/a.txt?select=10"
// httpUri.Query = "?select=10"

「ftp://someAddress/a.txt?select=10」の場合 - クエリ文字列も空

System.Uriはおそらく " a.txt?select=10 " を正しいファイル名 " a.txt%3Fselect=10 " に解決することを理解していますが、なぜ - これをエスケープする方法は?

前もって感謝します

4

2 に答える 2

10

これはMicrosoftが修正しないバグです:バグ594562ご覧 のとおり、回避策としてリフレクションを提案しています。

...
Console.WriteLine("Before");
Uri fileUri = new Uri("file://host/path/file?query#fragment");
Console.WriteLine("AbsoluteUri: " + fileUri.AbsoluteUri);
Console.WriteLine("ToString: " + fileUri.ToString());
Console.WriteLine("LocalPath: " + fileUri.LocalPath);
Console.WriteLine("Query: " + fileUri.Query);
Console.WriteLine("Fragment: " + fileUri.Fragment);

Type uriParserType = typeof(UriParser);
FieldInfo fileParserInfo = uriParserType.GetField("FileUri", BindingFlags.Static | BindingFlags.NonPublic);
UriParser fileParser = (UriParser)fileParserInfo.GetValue(null);
FieldInfo fileFlagsInfo = uriParserType.GetField("m_Flags", BindingFlags.NonPublic | BindingFlags.Instance);
int fileFlags = (int)fileFlagsInfo.GetValue(fileParser);
int mayHaveQuery = 0x20;
fileFlags |= mayHaveQuery;
fileFlagsInfo.SetValue(fileParser, fileFlags);

Console.WriteLine();
Console.WriteLine("After");
fileUri = new Uri("file://host/path/file?query#fragment");
Console.WriteLine("AbsoluteUri: " + fileUri.AbsoluteUri);
Console.WriteLine("ToString: " + fileUri.ToString());
Console.WriteLine("LocalPath: " + fileUri.LocalPath);
Console.WriteLine("Query: " + fileUri.Query);
Console.WriteLine("Fragment: " + fileUri.Fragment);  
...  
于 2012-01-06T14:10:40.407 に答える
5

ローカル ファイルを要求する場合、クエリ文字列パラメーターは無効です。

http を使用してファイルを要求すると、ファイルが実行されるため、クエリ文字列を読み取って処理できます。ローカル ファイルを要求しても実行されないため、クエリ文字列を使用できません。

ファイル リクエストにクエリ文字列パラメータを追加する理由は何ですか? それを行う別の方法はありますか?

于 2012-01-06T12:18:20.917 に答える