2012-01-06 15 views
7

ファイルの処理中に後でパスを解析するために、クエリパラメータ として追加のクエリ情報をファイルパスに追加する必要があります。私はSystem.Uriのクラスでこれを助けることができますが、ローカルファイルパスに期待していたものではないようです。 "?FTP://someAddress/a.txt = 10を選択する" の場合には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" 

- クエリ文字列が

私は可能System.Uriはおそらく「解決されることを理解しても空です。ファイル名を「a.txt%3Fselect = 10」に修正するには、「txt?select = 10」ですが、どうしてこれをエスケープするのですか?

ありがとうございます

+1

。そして、Urisにはパラメータがあります。 – ordag

+0

@ordag - 私の主張は、FTPサーバーであり、OSはこれらのパラメータで何もしません。 – Oded

+2

@Odedそれは本当ですが、それらは有効です。そして、後の処理でそのパラメータを解析することを望んでいます。 – ordag

答えて

8

これは、Microsoftが修正されませんバグです:Bug 594562 をあなたは彼らが回避策として反射を提案する見ることができるように:彼らはURIをしているので@Oded

... 
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); 
... 
+0

ありがとう - それが理解できる、なぜそれが期待どおりに動作しないのか – Vitaliy

5

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

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

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

+0

私はこのような構成を使用している理由は、*ファイル*フォルダ* txt *ファイルへのアクセス - "ファイル/?select = *。txt "へのアクセスなど、簡単で分かりやすいクエリを作成することですファイル "file.txt?line = 10"の行 – Vitaliy

+0

私はUriコンストラクタを呼び出すと、本当にファイルにアクセスしようとしているのですか?おそらく、* ftp *と* file *プロトコルにはクエリパラメータの使用法がないと理解しています.Uriクラスはいくつかのインターラルパス解決を提供しています。しかし、@ordagは言いました - UrisとUrisがクエリパラメータをサポートしています – Vitaliy

+0

そして再び同様のクエリ構造がXSLTで使用されています(例えばfn:collection関数を使って) - 次のXPath "count(collection( 'file: ///d:/collection/?select=*.xml ')) " – Vitaliy

関連する問題