zoukankan      html  css  js  c++  java
  • C# 不能用于文件名的字符

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

    那么具体是包括哪些符号不能作为文件名?

    • Tilde (~)
    • Number sign (#)
    • Percent (%)
    • Ampersand (&)
    • Asterisk (*)
    • Braces ({ })
    • Backslash ()
    • Colon (:)
    • Angle brackets (< >)
    • Question mark (?)
    • Slash (/)
    • Plus sign (+)
    • Pipe (|)
    • Quotation mark (")

    上面这些字符不能用来文件名和文件夹名

    而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建.file这样的文件,但是用户是难以自己输入这样的文件名。

    之外还有一些文件名是保留,不能创建这样的文件名

    CON, PRN, AUX, CLOCK$, NUL
    COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
    LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.

    尝试新建一个文本,然后把他文件名命名为上面的任意一个,基本windows会说不能把文件命名

    那么是不是把这些字符串拿出来判断?实际上微软已经做了这个了,因为在不同的系统,可能之后会添加新的字符串,所以最好不要自己写。

    可以使用微软给的函数System.IO.Path.GetInvalidFileNameChars ,下面的代码可以直接使用

            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 '':
                case 'f':
                case '?':
                    break;
                case '	':
                case '
    ':
                case '
    ':
                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();
    }

    上面的代码是jnm2 大神写的

    参见:Information about the characters that you cannot use in site names, folder names, and file names in SharePoint

    c# - How to make a valid Windows filename from an arbitrary string

    我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/lindexi/p/12087211.html
Copyright © 2011-2022 走看看