我偶然发现GetFiles
中System.IO.Directory
方法的未记录行为。
[每当传递给该方法的searchPattern
参数包含保留的Windows设备名称,例如"nul.*"
或"aux.bmp"
时,该方法都会返回一个包含不存在的文件名的数组,例如C:\Users\ft1\nul
或D:\aux
等
[我想知道这些设备名称在上下文中是否具有特殊含义,例如“。”。或“ ..”,或者这仅仅是一种错误。无论如何,那似乎仍然很奇怪。例如,此代码段在C#:
中string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt");
foreach (string fileName in fileNames) Console.WriteLine(fileName);
打印
C:\D:\..\..\...\con
任何线索?
这是已知的。这是关于Naming Files, Paths, and Namespaces (Windows)
的操作系统设计摘录:
请勿将以下保留名称用作文件名:CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9。也要避免在这些名称后面加上扩展名;例如,不建议使用NUL.txt。有关更多信息,请参见命名空间。
这些基本上是文件名别名(命名空间),因此它们始终全局存在(在每个文件夹中)。如果您尝试枚举它们,则会将它们取回,因为它们确实存在。
这些是MSDOS / NTFS的reserved words。
来自Wikipedia:
此外,在Windows和DOS实用程序中,某些单词也可能被保留,不能用作文件名。例如,DOS设备文件:
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将无法处理以下合法的UNIX文件名或为这些文件提供错误报告:aux.c,q“ uote” s.txt或NUL.txt。
内部使用的NTFS文件名包括:
$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure, $Upcase, $Extend, $Quota, $ObjId and $Reparse
作为补充,在MSTest
dll中使用json配置文件时出现了相关问题。当我将其命名为Test_Settings_Develop.json
时,Directory.GetFiles
找到了它,但说它不存在,因此在尝试加载它时,我的测试无法运行。
将其重命名为TestSettings_Develop.json并起作用。