2012-12-31 122 views
19

我只是偶然發現了System.IO.DirectoryGetFiles方法的無證行爲。Directory.GetFiles找到不存在的文件

每當傳遞給該方法的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 

任何線索?

回答

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

你知道,如果.NET Framework中有這樣的保留名稱的任何內置列表? –

+6

這是一個很好的問題,它可能會更好地問作爲一個實際的SO問題,但因爲問題[如何檢查給定的字符串是合法的(允許)在Windows下的文件名?](http://stackoverflow.com/questions/62771/how-check-if-given-string-is-legal-allowed-file-name-under-windows)已經被問到了,我會給你鏈接。 –

+0

非常感謝Erik! –

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 
+0

謝謝,我知道保留的MSDOS名稱,但這些內部NTFS文件名對我來說是新的。我必須給他們看,因爲我認爲他們也可能會導致我的應用程序出現問題。 –

相關問題