目录中.GetFiles查找不存在的文件



我偶然发现System.IO.DirectoryGetFiles方法的未记录行为。

当传递给方法的searchPattern参数包含保留的Windows设备名称时,如"nul.*""aux.bmp",该方法返回一个包含不存在的文件名的数组,如C:Usersft1nulD:aux等。

我想知道这些设备名称是否在上下文中有特殊的含义,比如"。"或"..",或者这只是一种错误。不管怎样,这看起来还是很奇怪。例如,c#中的以下代码片段:

string[] fileNames = Directory.GetFiles(@"C:D:.......", "con.txt");
foreach (string fileName in fileNames) Console.WriteLine(fileName);

打印

C:D:.......con

什么线索吗?

这是已知的。这是一个关于命名文件、路径和命名空间的操作系统设计(Windows)

摘录:

不要使用以下保留名称作为文件名:CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9。也要避免这些名字后面紧跟着一个扩展名;例如,不建议使用"null .txt"。有关更多信息,请参见名称空间。

这些基本上是文件名别名(名称空间),所以它们总是全局存在(在每个文件夹中)。如果您尝试枚举它们,您将返回它们,因为它们确实存在。

这些是MSDOS/NTFS的保留字。

从维基百科:

此外,在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" ute "s.txt,或null .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。

相关内容

  • 没有找到相关文章