来自 威尼斯国际官方网站 2019-10-04 13:38 的文章
当前位置: 威尼斯国际官方网站 > 威尼斯国际官方网站 > 正文

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

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

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

威尼斯国际官方网站 1

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

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

        private const string str = "lindexi";
        static void Main(string[] args)
        {
            Foo();
            Console.WriteLine(str);
        }
  • Tilde (~)
  • Number sign (#)
  • Percent (%)
  • Ampersand (&)
  • Asterisk (*)
  • Braces ({ })
  • Backslash ()
  • Colon (:)
  • Angle brackets (< >)
  • Question mark (?)
  • Slash (/)
  • Plus sign (+)
  • Pipe (|)
  • Quotation mark (")

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

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

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

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

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

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

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

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.

我把 Foo 做一些修改,把 str 变量去掉,这样大家就难以通过搜索变量引用找到了这个函数。但是我在其他的某个地方使用了这个常量字符串,于是就把上面的 str 修改为 "lindexi" 。大家也许会想,这是两个变量,对他做什么修改也不会对之前的 str 有什么影响。实际上,请跑一下下面的代码。

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

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

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

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

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

关键词: