В этом случае, очевидно, речь шла об особом значении, aux
унаследованном от времен DOS , как правильно указала Хеннес . Однако для читателей, спотыкающихся об этом в будущем, я хотел бы добавить еще один возможный случай, когда это поведение можно увидеть.
Вот когда файл был создан с конечной точкой. Есть и более экзотические случаи. Но filename.ext.
было бы такое имя файла и не может обычно удаляться из подсистемы Win32. Вот тут-то и приходит хитрость из Каран . Он / она использует имя, которое перед передачей на уровень ниже подсистемы Win32 будет изменено с его \\?\C:\...
формы на «родную» (это также видят драйверы файловой системы) форма \??\C:\...
. Принимая во внимание, что в зависимости от версии Windows это может быть так называемый объектный каталог (используйте WinObj из Sysinternals / Microsoft, чтобы заглянуть в пространство имен менеджера объектов) или символическую ссылку (не путать с одноименным объектом в NTFS начиная с Vista) в другой объектный каталог, такой как\DosDevices
, Последнее является просто одним именем и описывает часть пространства имен менеджера объектов, видимую для процессов Win32 по умолчанию. Для получения более подробной информации ознакомьтесь с серией книг «Внутренние компоненты Windows» или ознакомьтесь с разбором путей, в частности, в Google Project Zero («Полное руководство по преобразованию путей Win32 в NT») . В частности, вы можете обратить внимание на разницу между пространствами имен файлов Win32 и пространствами имен устройств Win32 .
Теперь, как вообще можно создать такой файл? Есть несколько возможностей.
- Программа Win32, которая использует
\\?\X:
префикс для имен путей, чтобы увеличить доступную длину пути с 260 символов до приблизительно 32767 символов (см. сноску 1!), создала файл в первую очередь, обойдя таким образом некоторые ограничения подсистемы Win32.
- программа коренится в другой подсистеме. Была создана бывшая подсистема POSIX (позже Interix, теперь SUA), подсистема OS / 2 (давно ушедшая, но существовавшая в NT 3.51) или какой-то слой, который не совсем подсистема в смысле Windows (Cygwin, насколько мне известно) файл или папка. Точно так же WSL (Windows Subsystem для Linux) в Windows 10 теперь является другим кандидатом.
- его создала другая операционная система (например, параллельная загрузка Linux).
- это файл в сетевой папке, расположенный на сервере, отличном от Windows.
Последние два пункта также намекают на одно из упомянутых средств: загрузите не-Windows live CD и удалите файл (ы).
Эта проблема на самом деле может сравниться со случаем, когда старая не-Unicode Win32 программа сталкивается с именами файлов из нескольких кодовых страниц. Часто он не может «найти» некоторые из них, потому что каждая соответствующая кодовая страница ANSI может вмещать только 256 символов, тогда как UTF-16 (но не его подмножество UCS-2) теоретически может кодировать практически неограниченное количество кодовых точек. (читайте эту тему на unicode.org и в Википедии ).
Надеюсь, что это поможет понять основные проблемы немного больше. Не хотел редактировать этот длинный ответ в одном из других ответов, хотя он только дополняет их. Другие ответы совершенно без него действительны.
Сноска 1: максимальное количество символов в пути не является абсолютным, поскольку путь, близкий к абсолютному максимуму (32767 символов), может быть расширен как менеджерами объектов, так и фильтрами файловой системы или самими файловыми системами (например, точками повторной обработки) ,