我需要添加一些额外的查询信息,文件路径的查询参数 文件处理过程后解析路径。不过,我觉得是的的System.Uri 的类可以帮助我,但看起来它并没有给我什么我预期的本地文件的路径。
I need to add some additional query information to file path as query parameter to parse path later during files processing. I though that System.Uri class can help me with this, but it looks like it doesn't give me what I expected for local file paths.
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 - 查询字符串也是空的
In the case of "ftp://someAddress/a.txt?select=10" - query string is also empty
我明白的的System.Uri 的可能解决 a.txt中?选择= 10 ,以正确的文件名 a.txt中%3Fselect = 10 ,但为什么 - 怎么逃生呢?
I understand that System.Uri probably resolves "a.txt?select=10" to correct file name "a.txt%3Fselect=10", but WHY - how to escape this?
在此先感谢
这是微软将不会修复一个bug:错误594562 正如你所看到的,他们提出反思作为一种解决方法:
This is a bug which Microsoft won't fix : Bug 594562 As you can see they propose reflection as an workaround:
...
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);
...