Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Directory.GetFiles查找不存在的文件_C#_.net_Windows_File_Getfiles - Fatal编程技术网

C# Directory.GetFiles查找不存在的文件

C# Directory.GetFiles查找不存在的文件,c#,.net,windows,file,getfiles,C#,.net,Windows,File,Getfiles,我刚刚偶然发现了System.IO.Directory中GetFiles方法的一个未记录行为 每当传递给该方法的searchPattern参数包含保留的Windows设备名称时,如“nul.*”或“aux.bmp”,该方法返回一个包含不存在文件名的数组,如C:\Users\ft1\nul或D:\aux等 我想知道这些设备名称在上下文中是否有特殊含义,比如“.”或“.”,或者这只是一种bug。不管怎样,这看起来还是很奇怪。 例如,C#中的此代码段: 印刷品 C:\D:\..\..\...\con

我刚刚偶然发现了
System.IO.Directory
GetFiles
方法的一个未记录行为

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

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

印刷品

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

有什么线索吗?

这是已知的。这是一个操作系统的设计

摘录:

请勿将以下保留名称用作文件名: 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提供的

发件人:

此外,在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\u Settings\u Develop.json
Directory.GetFiles
找到了它,但说它不存在,所以在尝试加载它时,我的测试无法运行


将其重命名为TestSettings_develope.json,并成功运行。

您知道.NET Framework是否有任何内置的保留名称列表吗?这是一个好问题,可能最好将其作为一个实际的SO问题来问,但既然问题已经问过了,我会给您链接。这完全正确-啊,与遗留系统打交道的代价……很多都来自DOS时代。:)@JerKimball这并不是真正的遗留问题,它只是一个文本输入/输出接口的价格。谢谢,我知道保留的MSDOS名称,但这些内部NTFS文件名对我来说是新的。我必须给他们看一看,因为我认为他们也可能会在我的应用程序中造成问题。
$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure,
$Upcase, $Extend, $Quota, $ObjId and $Reparse