I just stumbled upon an undocumented behavior of the GetFiles
methods in System.IO.Directory
.
Whenever the searchPattern
parameter passed to the method contains a reserved Windows device name, such as "nul.*"
or "aux.bmp"
, the method returns an array containing the name of a nonexisting file, like C:\Users\ft1\nul
or D:\aux
, etc.
I wonder if those device names have a special meaning it that context, like "." or "..", or if this is just a sort of bug. Anyway, that still seems pretty weird. For example, this code snippet in C#:
string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt");
foreach (string fileName in fileNames) Console.WriteLine(fileName);
prints
C:\D:\..\..\...\con
Any clues?
This is known. It is an operating system design regarding Naming Files, Paths, and Namespaces (Windows)
Excerpt:
Do not use the following reserved names for the name of a file: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. Also avoid these names followed immediately by an extension; for example, NUL.txt is not recommended. For more information, see Namespaces.
These are basically filename aliases (namespaces), so they always exist globally (in every folder). If you attempt to enumerate them, you'll get them back because they do exist.
These are reserved words by MSDOS/NTFS.
From Wikipedia:
In addition, in Windows and DOS utilities, some words might also be reserved and can not be used as filenames. For example, DOS device files:
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.
Systems that have these restrictions cause incompatibilities with some other filesystems. For example, Windows will fail to handle, or raise error reports for, these legal UNIX filenames: aux.c, q"uote"s.txt, or NUL.txt.
NTFS filenames that are used internally include:
$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure, $Upcase, $Extend, $Quota, $ObjId and $Reparse
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With