2

ファイルパスをエンコード/エスケープおよびデコード/エスケープ解除する簡単な方法を探しています (ファイルパスの不正な文字"\/?:<>*| )

HttpUtiliy.UrlEncode文字をエンコードしないことを除いて、その仕事をし*ます。

私が見つけたのは、正規表現でエスケープするか、不正な文字を次のように置き換えることだけでした_

一貫してエンコード/デコードできるようにしたい。

それを行うための定義済みの方法があるかどうか、またはエンコードするコードとデコードする別のコードを記述する必要があるかどうかを知りたいです。

ありがとう

4

3 に答える 3

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 ビット表現を 16 進数で置き換え、その逆に置き換えます。(おそらく、あなたが持っている特定の文字を 8 ビットで表現することでうまくいくかもしれませんが、私は安全のために間違っていると思いました。)

于 2013-02-26T11:26:34.963 に答える
-1

問題なく次の方法をしばらく使用しています。

public static string SanitizeFileName(string filename) {
    string regex = String.Format(@"[{0}]+", Regex.Escape(new string(Path.GetInvalidFileNameChars())));
    return Regex.Replace(filename, regex, "_");
}
于 2013-02-26T11:13:25.937 に答える