Подтвердить что ты не робот

Directory.GetFiles находит несуществующие файлы

Я просто наткнулся на недокументированное поведение методов GetFiles в System.IO.Directory.

Всякий раз, когда параметр searchPattern, переданный методу, содержит зарезервированное имя устройства Windows, например "nul.*" или "aux.bmp", метод возвращает массив, содержащий имя несуществующего файла, например C:\Users\ft1\nul или D:\aux и т.д.

Интересно, имеют ли эти имена устройства особый смысл в этом контексте, например "." или "..", или если это всего лишь своего рода ошибка. Во всяком случае, это все еще кажется довольно странным. Например, этот фрагмент кода в С#:

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

печатает

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

Любые подсказки?

4b9b3361

Ответ 1

Это известно. Это дизайн операционной системы, относящийся к Именование файлов, путей и пространств имен (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 не рекомендуется. Для получения дополнительной информации см. Пространства имен.

Это в основном псевдонимы имен файлов (пространства имен), поэтому они всегда существуют глобально (в каждой папке). Если вы попытаетесь перечислить их, вы получите их обратно, потому что они существуют.

Ответ 2

Это зарезервированные слова от MSDOS/NTFS.

Из 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