2012-01-06 62 views
7

我需要在文件路徑中添加一些額外的查詢信息作爲查詢參數 以在文件處理期間稍後解析路徑。我雖然System.Uri類可以幫助我,但它看起來像它不給我我所期望的本地文件路徑。爲什麼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選擇= 10」 - 查詢字符串也是空

我明白的System.Uri可能解決「一個。 txt?select = 10「以更正文件名」a.txt%3Fselect = 10「,但是爲什麼 - 如何逃避這個?

感謝事先請求本地文件時

+1

@Oded由於它們的URI。並且Uris有參數。 – ordag 2012-01-06 12:25:55

+0

@ordag - 我的觀點是FTP服務器和操作系統不會使用這些參數來做_anything_。 – Oded 2012-01-06 12:27:08

+2

@Oded這是真的,但它們是有效的。作者想在後面的處理中自己分析這些參數。 – ordag 2012-01-06 12:31:51

回答

8

這是微軟不會修復一個bug:Bug 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); 
... 
+0

謝謝 - 那麼這是可以理解的,爲什麼它不能按預期工作 – Vitaliy 2012-01-06 14:24:09

5

查詢字符串參數無效。

當您使用http請求文件時,該文件被執行,因此能夠讀取和處理查詢字符串。當你請求一個本地文件時,它不會被執行,所以無法使用查詢字符串。

將查詢字符串參數添加到文件請求的原因是什麼?還有另一種方法嗎?

+0

我使用這種構造的原因是爲了使查詢簡單易懂 - 例如訪問*文件*文件夾* txt *文件 - 」文件/?select = *。txt「,訪問10日行在文件「file.txt?line = 10」 – Vitaliy 2012-01-06 12:40:27

+0

你的意思是,當我調用Uri構造函數 - 它真的試圖訪問文件?我認爲它只是將url解析成部分 - 我知道可能* ftp *和* file *協議沒有用於查詢參數 - 而Uri類提供了一些內部路徑解析。但是正如@ordag提到的那樣 - 它們是Uris和Uris支持的查詢參數 – Vitaliy 2012-01-06 12:48:18

+0

而且 - 在XSLT中使用類似的查詢構造(例如fn:collection函數) - 允許編寫以下XPath「count(collection('file: ///d:/collection/?select=*.xml'))「 – Vitaliy 2012-01-06 12:52:13

相關問題