Имя папки было указано в проводнике с четырьмя точками ....
.
Когда я попытался открыть его, я попал в какую-то бесконечную петлю кроличьей норы, где я снова и снова открывал одну и ту же папку - я мог делать это бесконечно. Отображение пути как C:\ExamplePath\....\....\....\....\....
и т. Д.
Он повесил мою компиляцию TypeScript в одном конкретном проекте. У меня ушло больше года, прежде чем я нашел эту папку и связанные с ней проблемы, потому что она была глубоко укоренена во вложенных папках. Я никогда не ожидал такой проблемы, поэтому никогда не искал ее.
Я не мог удалить папку обычным способом из-за специального имени. В конце концов, я могу удалить его, используя командную строку и удалив родительскую папку с помощью rd /s /q path
.
После этого я снова попытался создать папку, но не смог сделать это ни с помощью Проводника, ни с помощью командной строки.
За 20 с лишним лет использования Windows я никогда раньше не сталкивался с этой ошибкой, поэтому могу себе представить, что это действительно будет раздражающей и запутывающей проблемой для пользователей-любителей.
Кто-нибудь знает, как это могло произойти и как воспроизвести эту проблему?
Обновить
Для людей, которые заинтересованы: этот путь находится глубоко в папке TFS. Так что, вероятно, TFS использует метод обхода, объясненный @grawity ( «Различные файловые менеджеры, архиваторы и т. Д.» )
Я наткнулся на редкую ошибку TFS?
источник
..
в пути можно использовать указание «перейти на одну папку», я рискну предположить, что где-то в строке какая-то программа или скрипт объединяют две строки для создания пути, одна из которых заканчивается..
, а следующая начинается с..
, и поскольку он использовал один из методов, упомянутых ниже, ему удалось создать путь, даже при том, что между ними отсутствовал разделитель папок.GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini
. Очевидно, что где-то есть / была какая-то уязвимость, которую он пытается использовать...
нет....
. Это просто способ перехода к\winnt
независимо от глубины начальной точки (веб-корня), если начальная точка имеет глубину менее 9 уровней. Он основан на том факте, что выход..
из корневого каталога оставляет вас в корневом каталоге...
именно поэтому я нашел это один довольно странно.Ответы:
Win32 не позволяет создавать файлы или папки с именами, заканчивающимися на
.
- все точки удаляются с конца. Попытка созданияtest.
делаетtest
появление вместо. (Это для совместимости с именами 8.3 в старом программном обеспечении эпохи DOS / Win9x.)В результате, когда вы пытаетесь получить доступ к папке с именем
....
, ее имя сводится к пустой строке, и вы возвращаетесь к папке, в которой вы были раньше.Ядро NT, однако, допускает такие имена. Существуют различные механизмы, которые обходят ограничения имени файла, налагаемые API-интерфейсами Win32 - например, WSL (Windows Subsystem for Linux) не работает поверх Win32 и не подвержен его влиянию. Существует также
\\?\
метод обхода, намеренный «черный ход», оставленный для программ, которые знают, что они делают. Даже если вы не можете создатьC:\Example\....\
, вы можете создать\\?\C:\Example\....\
просто отлично.Точно так же вы можете удалить такие каталоги с
rmdir \\?\C:\path\...
из Cmd (я не проверял с PowerShell все же).Различные файловые менеджеры, архиваторы и т. Д. Могут использовать этот
\\?\
метод, чтобы иметь возможность использовать более длинные пути, чем обычно, - и при этом на них также не влияет код совместимости в Win32; они обходят удаление точек, а также перевод волшебных имен файлов, таких какCON
илиNUL
.Так что это может быть одна из ваших программ:
\\?\
для доступа к файлам,....
- но на самом деле невозможно узнать наверняка по факту.источник
echo "" > ....::$INDEX_ALLOCATION
. Это создаст папку с именем....
(все еще указывая на текущую папку).\\?\"
в справочном источнике .NET это вызывает ошибку времени выполнения на их сервере).com1
волшебное имя файлаВ дополнение к ответу @ grawity, программа Win32 также может сделать это, напрямую вызвав «нативный» API. Если я не ошибаюсь, в данном случае это будет NtCreateDirectoryObject. Эти вызовы довольно хорошо документированы в настоящее время, особенно их аналог ядра (который вы не можете вызвать из программы Win32), в данном случае ZwCreateDirectoryObject.
Что касается «бесконечной глубины», то простым способом достижения этого является использование ссылок. Создайте каталог, затем внутри него создайте соединение с ним (вы можете использовать,
mklink /j
например), и вы получите очень глубокую структуру. В последний раз, когда я делал это на Windows 2000, рекурсия была окончена (вы не могли «копать бесконечно»). Возможно, на более новых ОС предел больше или удален, также вы можете создать, скажем, 10 каталогов, каждый из которых является дочерним по отношению к предыдущему, а в 10-м - создать ссылку на первую.источник
mkdir ....
Существует более простой способ создания каталога. Из командной строки введите:
MD ....\
и нажмите Enter, он создаст каталог с четырьмя точками. Этот каталог также можно просматривать с помощью проводника.
В MS-DOS есть недостаток, который восходит к версии 1.0. MS знал об этом в течение некоторого времени, но не мог или не хотел бы это исправить. Они исправили проблему с PowerShell.
Кстати, если вы попробуете:
RD ....
Это не удастся удалить. Вы должны использовать этот специфический синтаксис, чтобы удалить его.
RD ....\
Я использую это на определенных серверах, которые я администратор. Я часто создаю папку пользователя в корне диска и не хочу, чтобы другой администратор пришел и удалил ее.
Поэтому я зайду в свою папку и создаю подпапку с именем CON, AUX или LPT и т. Д.
Если другой администратор хочет удалить мою папку, он должен знать, как удалить эту подпапку.
РЕДАКТИРОВАТЬ: я думал об этой дискуссии сегодня утром, и я решил сделать еще один шаг вперед. Я предполагаю, что моды решат, если это актуально.
Я не могу записать CD в папку.
Подумайте, если я MD c: \ test, то CD C: \ test и MD .... \ Я получаю C: \ test ....
и все хорошо.
Но CD .... терпит неудачу и пинает меня обратно в C: \ test. (CD .... \ делает то же самое.)
Однако я могу DIR .... и получить список DIR. я тоже могу
MD C: \ test .... \ temp и создает этот подкаталог в ....
Я также могу CD C: \ test .... \ temp и перейти в этот подподкаталог.
Но пока я в C: \ test .... \ temp, если я CD ... я снова в C: \ test.
Я не могу перейти в этот каталог, но я могу манипулировать папкой, создавая подпапки, и достаточно интересно что-то вроде
ЭХО "Тестирование" >> C: \ test .... \ test.txt
также работает и создает файл в этой папке. Таким образом, я могу создать папку с четырьмя точками, я могу добавить в нее файлы и папки, я могу получить списки каталогов, но я не могу вставить в нее компакт-диск. Может ли быть какой-то злой гений использовать для этого? Мои извинения модам, если я отклонился слишком далеко от курса.
источник
MD ....` only creates
.... \ .... `tree - есть только один шаг рекурсии.У меня такая же проблема. В моем случае это была опечатка в команде для публикации .NET Core:
Он создал каталог с именем «....», который я не смог удалить или переименовать. Этот каталог действовал как ссылка на родительский каталог. Если я зайду в эту папку, я все еще буду в родительской папке, но путь будет добавлен как «....».
Я перепробовал все команды, упомянутые в этом разделе, но ни одна из них не сработала. В моем понимании, так и было, потому что у меня были другие файлы и каталоги в родительском каталоге, поэтому мне пришлось использовать параметры, которые могут рекурсивно удалять весь контент.
Я узнал, что это команда:
Можно удалить каталог «....». Он только удаляет ссылку на родительский каталог, которым на самом деле является этот каталог «....», ни больше, ни меньше. Несмотря на аргументы команды:
родительский каталог остался нетронутым.
источник