编码文件路径

时间:2009-06-23 11:57:03

标签: .net file-io

.net中是否有内置方法来编码文件路径,就像编码网址一样?例如,如果我在文件名中有非法字符,比如“what:whatever”,我希望它编码“:”,所以它仍然在那里,只是编码,以便系统接受它。我想做Path.Encode(fileName)

之类的事情

那里有这样的东西吗?

这就是我正在做的事情。我在wikipedia.org上搜索我在www.wikipediamaze.com创建的游戏。当我进行屏幕抓取时,我将结果缓存到我的app_data文件夹中的文件中,该文件与我所在的维基百科网站的当前主题的名称相匹配。例如,如果我在这个位置:

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

然后我抓取该页面,解析它,清理它等,然后缓存在磁盘上以便以后更快地退出。它存储在/App_Data/Kevin_Bacon (no file extension)位置。除非我在

这样的页面上,否则这很有效

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

尝试在/App_Data/Wikipedia:About创建文件显然不起作用,因为':'字符在文件名中是非法的。

更新

这对我很有用:

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

4 个答案:

答案 0 :(得分:9)

是无效字符:\ /:? “<> |

您只需要使用GetInvalidFileNameChars函数: (http://msdn.microsoft.com/library/system.io.path.getinvalidfilenamechars.aspx

string sanitizedString = Regex.Replace("Wikipedia:About", "[" + Regex.Escape(new string(Path.GetInvalidFileNameChars())) + "]", "_");

所有无效字符将被_(下划线)替换。

答案 1 :(得分:1)

不,我担心BCL中没有任何东西。

你必须编写自己的函数来替换无效的字符(通过迭代输入并使用StringBuilder)。但是,System.IO.Path.GetInvalidFileNameChars()方法可以帮助您完成此操作。

最简单的解决方案可能只是捕获在路径中指定了无效字符并向用户提供反馈时引发的异常。

答案 2 :(得分:1)

您是否需要文件名与网址中的文件名完全相同?

如果没有,则使用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有'/'字符,这是filename的无效字符。 转换后将'/'替换为' - '。

答案 3 :(得分:0)

这有帮助吗? C# Sanitize File Name