2017-10-08 53 views
1

在评价this question有人指出,这不是总是可能通过的System.Uri类的装置,用于将文件路径转换到URI字符串。这留下了一个问题:如何将一个任意文件路径表示为System.Uri?与逃生样序列转换文件路径的System.Uri

这里有一些细节。如果应用程序的目标是4.5以下的.Net版本,那么即使安装了.Net 4.5+,System.Uri构造函数也不会尝试忽略原始字符串。所以这个问题涉及到.Net 4.5+的代码。在那些更高版本中,任何从字符串创建System.Uri实例的方法都会以一些混乱的内部代码尝试“逃避”输入。结果是'%25'从未转义,但'%'后跟两个十六进制数字,编码任何非特殊的ASCII字符总是未转义。例如,

var uri = new System.Uri(@"C:\%51.txt"); 

给出一个URI与uri.LocalPath == @ “C:\ Q.txt”,和

var uri = new System.Uri(@"C:\%2551.txt"); 

与uri.LocalPath == @“C创建URI: \%2551.txt”。

乍一看,这似乎是不可能的非常有效的本地文件名“%51.txt”转换为等效的System.Uri。但也许有人知道一种方式?

+0

'新的URI( “文件:///” + Convert.ToBase64String(Encoding.UTF8.GetBytes(@ “C:\%51.txt”)))'。我只是半开玩笑。当然,唯一的问题是除了你之外,没有人能够从中得到回报。但是你绝对肯定地避免所有逃避的问题。 –

+0

这就是为什么我提到了一个等效的System.Uri,即以标准方式表示相同路径的URI。 –

+0

等价仅仅意味着一对一映射,这在您自己的方案下很容易建立。如果你只是想比框架给你更好的转义,你链接到的问题实际上有[答案](https://stackoverflow.com/a/35734486/4137916)。我不知道为什么这是不够的。重要的问题似乎是URI的目标消费者。如果您必须遵守一些软件关于如何转义路径的想法,请使用它并在必要时自行编写代码。否则,根本没有理由甚至使用'file://'方案的坏东西。 –

回答

0

采用this comment的答案。预构建的URI字符串应该用作System.Uri构造函数的参数,而不是原始本地路径,以避免转换问题,例如,新路径“%51.txt”的Uri(“file:/// C:%2551.txt”)。

相关问题