为什么不';t System.Uri识别本地文件路径的查询参数

本文关键字:文件 路径 参数 查询 识别 Uri System 为什么不 | 更新日期: 2023-09-27 18:19:32

我需要向文件路径添加一些额外的查询信息作为查询参数以便稍后在文件处理过程中解析路径。我认为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",但为什么-如何逃避?

提前感谢

为什么不';t System.Uri识别本地文件路径的查询参数

这是一个微软不会修复的错误:错误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);  
...  
请求本地文件时,查询字符串参数无效。

当您使用http请求文件时,该文件将被执行,因此能够读取和处理查询字符串。当您请求本地文件时,它不会被执行,因此无法使用querystring。

您向文件请求添加查询字符串参数的原因是什么?还有别的方法吗?