196

Имя папки было указано в проводнике с четырьмя точками ....

Когда я попытался открыть его, я попал в какую-то бесконечную петлю кроличьей норы, где я снова и снова открывал одну и ту же папку - я мог делать это бесконечно. Отображение пути как C:\ExamplePath\....\....\....\....\.... и т. д.

Он повесил мою компиляцию TypeScript в одном конкретном проекте. У меня ушло больше года, прежде чем я нашел эту папку и связанные с ней проблемы, потому что она глубоко укоренилась во вложенных папках. Я никогда не ожидал такой проблемы, поэтому никогда не искал ее.

Я не мог удалить папку обычным способом из-за специального имени. В конце концов, я могу удалить его, используя командную строку и удалив родительскую папку с rd /s /q path .

После этого я снова попытался создать папку, но не смог сделать это ни с помощью Проводника, ни с помощью командной строки.

За 20 с лишним лет использования Windows я никогда раньше не сталкивался с этой ошибкой, поэтому могу себе представить, что это действительно будет раздражающей и запутанной проблемой для пользователей-любителей.

Кто-нибудь знает, как это могло произойти и как воспроизвести эту проблему?

Обновить

Для людей, которые заинтересованы: этот путь находится глубоко в папке TFS. Так что, вероятно, TFS использует метод обхода, объясненный @grawity («Различные файловые менеджеры, архиваторы и т.д.»)

Я наткнулся на редкую ошибку TFS?

3 ответа3

303

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).

Различные файловые менеджеры, архиваторы и т.д. Могут использовать \\?\ method, чтобы иметь возможность использовать более длинные имена путей, чем обычно - и при этом на них также не влияет код совместимости в Win32; они обходят удаление точек, а также перевод волшебных имен файлов, таких как CON или NUL .

Так что это может быть одна из ваших программ:

  1. всегда использует \\?\ для доступа к файлам,
  2. случайно попытался создать папку с именем .... - но на самом деле невозможно узнать наверняка после этого.
22

В дополнение к ответу @ grawity, программа Win32 также может сделать это, напрямую вызвав "нативный" API. Если я не ошибаюсь, в данном случае это будет NtCreateDirectoryObject. Эти вызовы довольно хорошо документированы в настоящее время, особенно их аналог ядра (который вы не можете вызвать из программы Win32), в данном случае, ZwCreateDirectoryObject.

Что касается "бесконечной глубины", простой способ достичь этого - использовать ссылки. Создайте каталог, затем внутри него создайте соединение с ним (например, вы можете использовать mklink /j ), и вы получите очень глубокую структуру. В последний раз, когда я делал это на Windows 2000, рекурсия была окончена (вы не могли "копать бесконечно"). Возможно, на более новых ОС предел больше или удален, также вы можете создать, скажем, 10 каталогов, каждый из которых является дочерним по отношению к предыдущему, а в 10-м - создать ссылку на первую.

17

Существует более простой способ создания каталога. Из командной строки введите:

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

также работает и создает файл в этой папке. Таким образом, я могу создать папку с четырьмя точками, я могу добавить в нее файлы и папки, я могу получить списки каталогов, но я не могу вставить в нее компакт-диск. Может ли быть какой-то злой гений использовать для этого? Мои извинения модам, если я отклонился слишком далеко от курса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .