2017-10-08 24 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」)。