2009-06-23 86 views
11

在.net中是否有內置的方法來編碼文件路徑,方法與編碼url相同?例如,如果我在文件名中包含非法字符,比如「whatever:whatever」,我希望它對「:」進行編碼,所以它仍然存在,只是進行編碼以便系統接受它。我想要做一些類似於Path.Encode(fileName)對文件路徑進行編碼

這裏有什麼這樣的嗎?

這是我正在做的。我在wikipedia.org上爲我在www.wikipediamaze.com創建的遊戲颳了一個遊戲。當我進行屏幕抓取時,我將結果緩存在我的app_data文件夾中的一個文件中,該文件夾與我所在的維基百科網站的當前主題的名稱相匹配。舉例來說,如果我在的位置:

http://www.wikipedia.org/wiki/Kevin_Bacon

然後我湊該網頁,解析它,擦乾淨等,然後在磁盤緩存更快retireval以後。它被存儲在位置/App_Data/Kevin_Bacon (no file extension)。這個偉大的工程,除非我的網頁上像

http://www.wikipedia.org/wiki/Wikipedia:About

試圖在/App_Data/Wikipedia:About創建一個文件顯然是因爲不工作「:」字符是一個文件名非法。

UPDATE

這對我的偉大工程:

public static string EncodeAsFileName(this string fileName) 
    { 
     return Regex.Replace(fileName, "[" + Regex.Escape(        
       new string(Path.GetInvalidFileNameChars())) + "]", " "); 
    } 
+0

我可以問你爲什麼要這樣做嗎?它可以幫助我和其他人確定適當的解決方案。 – Lazarus 2009-06-23 12:17:58

回答

1

沒有,恐怕沒有任何存在於BCL。

您必須編寫自己的函數來替換無效字符(可能是迭代輸入並使用StringBuilder)。 System.IO.Path.GetInvalidFileNameChars()方法將幫助您做到這一點。

但是,最簡單的解決方案可能只是捕獲在路徑中指定無效字符並向用戶提供反饋時引發的異常。

1

你需要的文件名是。就像它們在url中一樣?

如果不是,則使用Base64文件名。無論何時創建文件,在寫入或讀取文件之前將文件名轉換爲base64。

static public string EncodeTo64(string toEncode) 
{ 
    byte[] bytes 
      = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
    string stringBase64 
      = System.Convert.ToBase64String(bytes); 
    return stringBase64; 
} 

string fileName64 = Path.Combine(AppDataPath, EncodeTo64("Wikipedia:About")); 

編輯:我意識到Base64有'/'字符這是一個無效字符的文件名。 轉換後用' - '替換'/'。

+0

我喜歡這個想法。 Base 64編碼不包含任何非法的文件名字符? – Micah 2009-06-23 14:32:03