Directory.GetFiles找到不存在的文件

GOT*_*O 0 19 .net c# windows file getfiles

我只是偶然发现了这些GetFiles方法的无证行为System.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);
Run Code Online (Sandbox Code Playgroud)

版画

C:\D:\..\..\...\con
Run Code Online (Sandbox Code Playgroud)

有线索吗?

Eri*_*ips 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.有关更多信息,请参阅命名空间.

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

  • 这是一个很好的问题,最好问一下这是一个真正的SO问题,但问题是[如何检查字符串是否合法(允许)在Windows下的文件名?](http://stackoverflow.com/问题/ 62771/how-check-if-given-string-is-legal-allowed-file-name-under-windows)已被问到,我会给你链接. (6认同)

Til*_*lak 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.
Run Code Online (Sandbox Code Playgroud)

具有这些限制的系统会导致与某些其他文件系统不兼容.例如,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
Run Code Online (Sandbox Code Playgroud)