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
Любые подсказки?
Ответы
Ответ 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