19

我只是偶然发现GetFilesSystem.IO.Directory.

只要searchPattern传递给该方法的参数包含保留的 Windows 设备名称,例如"nul.*"or "aux.bmp",该方法就会返回一个包含不存在文件名称的数组,例如C:\Users\ft1\nulorD:\aux等​​。

我想知道这些设备名称是否在上下文中具有特殊含义,例如“。” 或“..”,或者如果这只是一种错误。无论如何,这仍然看起来很奇怪。例如,C# 中的这段代码片段:

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

印刷

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

有什么线索吗?

4

3 回答 3

28

这是众所周知的。它是关于命名文件、路径和命名空间 (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。有关详细信息,请参阅命名空间。

这些基本上是文件名别名(命名空间),因此它们总是全局存在(在每个文件夹中)。如果你试图枚举它们,你会得到它们,因为它们确实存在。

于 2012-12-31T17:39:30.987 回答
10

这些是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"uote"s.txt 或 NUL.txt。

内部使用的 NTFS 文件名包括:

$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure,
$Upcase, $Extend, $Quota, $ObjId and $Reparse
于 2012-12-31T17:40:36.327 回答
0

作为对此的补充,在MSTestdll 中使用 json 配置文件时存在相关问题。当我调用它时Test_Settings_Develop.jsonDirectory.GetFiles找到了它,但说它不存在,所以我的测试在尝试加载它时无法运行。

将其重命名为 TestSettings_Develop.json 并且可以正常工作。

于 2020-03-02T11:23:18.587 回答