来自 奥门威尼斯网址 2019-12-18 18:30 的文章
当前位置: 威尼斯国际官方网站 > 奥门威尼斯网址 > 正文

谁改了我的代码,不能用于文件名的字符

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

虽然出现了问题,但是找到问题很简单,如果这时需要做一个安全有关的。让别人看到源代码也不知道怎么使用,那么就可以使用这个科技,下面就是显示技术的时候

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

        private const string str = "lindexi";
        static void Main(string[] args)
        {
            Foo();
            Console.WriteLine(str);
        }

上面的代码是jnm2 大神写的

其中的 Foo 是其他的函数,大家可以猜到输出是 lindexi ,但是,实际上把Foo调用函数添加之后,输出是 Lindexi 被大写了。那么这时 Foo 做了什么?

如果确实需要显示文件名,请使用下面代码

Foo 做的就是
C# 字符串首字符大写

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

这时输出 str 结果是 Lindexi ,因为编译器把相同的常量视为同一个地址,这样修改一个地方的常量就可以修改其他地方的。所以可以写的是一个常量,实际上这个常量在另一个地方被修改。

        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();
        }

这个方法是不推荐在一般情况使用,因为谁都不能说没有其他地方使用一样的字符串。

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

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

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

本文告诉大家一个特殊的做法,可以修改一个字符串常量

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 '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();
}

我们来写一个简单的程序,把一个常量字符串输出

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

        public static unsafe void Foo()
        {
            fixed (char* ptr = str)
            {
                *ptr = char.ToUpper(*ptr);
            }
        }

本文由威尼斯国际官方网站发布于奥门威尼斯网址,转载请注明出处:谁改了我的代码,不能用于文件名的字符

关键词: