C#文件路径编码和解码

时间:2013-02-26 11:03:48

标签: c# encoding path decoding illegal-characters

我正在寻找一种简单的方法来编码/转义和解码/转换文件路径(文件路径中的非法字符"\/?:<>*|

HttpUtiliy.UrlEncode完成其工作,但不会对*字符进行编码。

我所能找到的只是用正则表达式转义,或者用_替换非法字符

我希望能够一致地编码/解码。

我想知道是否有预先定义的方法来执行此操作,或者我只需要编写一些代码进行编码,然后再编写另一部分进行解码。

由于

3 个答案:

答案 0 :(得分:6)

我之前从未尝试过这样的事情,所以我把它扔到了一起:

static class PathEscaper
{
    static readonly string invalidChars = @"""\/?:<>*|";
    static readonly string escapeChar = "%";

    static readonly Regex escaper = new Regex(
        "[" + Regex.Escape(escapeChar + invalidChars) + "]",
        RegexOptions.Compiled);
    static readonly Regex unescaper = new Regex(
        Regex.Escape(escapeChar) + "([0-9A-Z]{4})",
        RegexOptions.Compiled);

    public static string Escape(string path)
    {
        return escaper.Replace(path,
            m => escapeChar + ((short)(m.Value[0])).ToString("X4"));
    }

    public static string Unescape(string path)
    {
        return unescaper.Replace(path,
            m => ((char)Convert.ToInt16(m.Groups[1].Value, 16)).ToString());
    }
}

它用%替换任何禁用的字符,后跟16位十六进制表示,然后返回。 (对于你所拥有的特定角色,你可能会得到一个8位的表示,但我认为我在安全方面犯了错误。)

答案 1 :(得分:3)

罗林的解决方案很好。但是有一个小问题。从Rawling方法生成的文件名可能包含“%”,如果您将此路径名用作url,则可能会导致一些错误。 因此,我将escapeChar从“%”更改为“__”,以确保生成的文件名与url约定兼容。

static class PathEscaper
{
    static readonly string invalidChars = @"""\/?:<>*|";
    static readonly string escapeChar = "__";

    static readonly Regex escaper = new Regex(
        "[" + Regex.Escape(escapeChar + invalidChars) + "]",
        RegexOptions.Compiled);
    static readonly Regex unescaper = new Regex(
        Regex.Escape(escapeChar) + "([0-9A-Z]{4})",
        RegexOptions.Compiled);

    public static string Escape(string path)
    {
        return escaper.Replace(path,
            m => escapeChar + ((short)(m.Value[0])).ToString("X4"));
    }

    public static string Unescape(string path)
    {
        return unescaper.Replace(path,
            m => ((char)Convert.ToInt16(m.Groups[1].Value, 16)).ToString());
    }
}

答案 2 :(得分:-1)

我一直在使用以下方法一段时间没有问题:

public static string SanitizeFileName(string filename) {
    string regex = String.Format(@"[{0}]+", Regex.Escape(new string(Path.GetInvalidFileNameChars())));
    return Regex.Replace(filename, regex, "_");
}