Directory.GetFiles找到不存在的文件

时间:2012-12-31 17:34:34

标签: c# .net windows file getfiles

我只是偶然发现了GetFilesSystem.IO.Directory方法的无证行为。

每当传递给方法的searchPattern参数包含保留的Windows设备名称(例如"nul.*""aux.bmp")时,该方法返回一个包含不存在文件名称的数组,如C:\Users\ft1\nulD:\aux

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

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

打印

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

任何线索?

3 个答案:

答案 0 :(得分:28)

这是众所周知的。它是关于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。有关更多信息,请参阅命名空间。

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

答案 1 :(得分:10)

这些是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

答案 2 :(得分:0)

作为补充,在MSTest dll中使用json配置文件时出现了一个相关问题。 当我将其命名为Test_Settings_Develop.json时,Directory.GetFiles找到了它,但说它不存在,因此在尝试加载它时,我的测试无法运行。

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