2009-06-23 164 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