C# 处理 Windows 非法字符

在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,例如输入英文的/就可以看到 Windows 提示的不能作为文件名的字符:

那么具体是包括哪些符号不能作为文件名,这些字符不能用来文件名和文件夹名。

NameSymbol
Tilde~
Number sign#
Percent%
Ampersand&
Asterisk*
Braces{ }
Backslash\
Colon:
Angle brackets<>
Question mark?
Slash/
Plus sign+
Pipe|
Quotation mark‘’

微软提供了 System.IO.Path.GetInvalidFileNameChars 来获取所有非法字符,下面的代码可以直接用于将非法字符替换为任意字符:

/**
 * @param text: 原始串
 * @param replacement: 要替换的字符串
 */
public static string MakeValidFileName(string text, string replacement = "_")
{
    StringBuilder str=new StringBuilder();
    var invalidFileNameChars = System.IO.Path.GetInvalidFileNameChars();
    foreach (var c in text)
    {
        if (invalidFileNameChars.Contains(c))
        {
            str.Append(replacement??"");
        }
        else
        {
            str.Append(c);
        }
    }

    return str.ToString();
}

如果你仍然要显示非法字符,可以使用下面的代码:

public static string GetSafeFilename(string arbitraryString)
{
    var invalidChars = System.IO.Path.GetInvalidFileNameChars();
    var replaceIndex = arbitraryString.IndexOfAny(invalidChars, 0);
    if (replaceIndex == -1) return arbitraryString;

    var r = new StringBuilder();
    var i = 0;

    do
    {
        r.Append(arbitraryString, i, replaceIndex - i);

        switch (arbitraryString[replaceIndex])
        {
            case '"':
                r.Append("''");
                break;
            case '<':
                r.Append('\u02c2'); // '˂' (modifier letter left arrowhead)
                break;
            case '>':
                r.Append('\u02c3'); // '˃' (modifier letter right arrowhead)
                break;
            case '|':
                r.Append('\u2223'); // '∣' (divides)
                break;
            case ':':
                r.Append('-');
                break;
            case '*':
                r.Append('\u2217'); // '∗' (asterisk operator)
                break;
            case '\\':
            case '/':
                r.Append('\u2044'); // '⁄' (fraction slash)
                break;
            case '\0':
            case '\f':
            case '?':
                break;
            case '\t':
            case '\n':
            case '\r':
            case '\v':
                r.Append(' ');
                break;
            default:
                r.Append('_');
                break;
        }

        i = replaceIndex + 1;
        replaceIndex = arbitraryString.IndexOfAny(invalidChars, i);
    } while (replaceIndex != -1);

    r.Append(arbitraryString, i, arbitraryString.Length - i);

    return r.ToString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值