问题 编码文件路径


在.net中是否有内置的方法来编码文件路径,就像编码url一样?例如,如果我在文件名中有非法字符,比如“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 显然不起作用,因为':'字符在文件名中是非法的。

UPDATE

这对我很有用:

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

9133
2018-06-23 11:57


起源

我可以问你为什么要这样做吗?它可以帮助我和其他人确定适当的解决方案。 - Lazarus


答案:


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

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

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

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


9
2018-06-23 13:56





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

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

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


1
2018-06-23 12:00





您是否需要文件名与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有'/'字符,这是filename的无效字符。 转换后将'/'替换为' - '。


1
2018-06-23 14:19



我喜欢这个主意。 Base 64编码不包含任何非法文件名字符? - Micah


这有帮助吗? C#清理文件名


0
2018-06-23 12:01