Это на самом деле довольно просто исправить. Скажем, что структура каталогов такова:
C:\Dir1\Dir1\Dir1\Dir1…
Чтобы исправить это, просто переименуйте каждую папку в одно-символьное имя папки, пока она не станет слишком длинной для удаления:
- Переименовать
C:\Dir1
вC:\D
- Перейдите к
C:\D\
- Переименовать
C:\D\Dir1
вC:\D\D
- Перейдите к
C:\D\D\
- Переходите к 1, пока общая длина пути не станет <260
Вот пакетный файл для автоматизации процесса (эта простая версия лучше всего подходит для простых каталогов, подобных описанным в вопросе, особенно для одноразовых). Передайте ему максимально возможную папку (например, C:\Dir1
для C:\Dir1\Dir1\Dir1…
или C:\Users\Bob\Desktop\New Folder
для C:\Users\Bob\Desktop\New Folder\abcdefghi…
)
@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _
%0
popd
Техническое объяснение
Другие предлагаемые решения являются обратными; вы не можете это исправить, прокладывая себе путь из самой внутренней директории наружу, вам нужно идти в другом направлении.
Когда вы пытаетесь получить доступ к каталогу, вы делаете это, используя его абсолютный путь, явно или нет, который включает в себя все, что было до него. Следовательно, для такой структуры каталогов C:\Dir1\Dir1\Dir1\Dir1
длина пути до самого внутреннего Dir1
равна 22. Однако длина пути до самого внешнего Dir1
составляет всего 7, и поэтому все еще доступна независимо от ее содержимого (в контексте пути данного каталога файловая система не знает, что она содержит, или как она влияет на общую длину пути своих дочерних каталогов, только каталоги-предки - вы не можете переименовать каталог, если общая длина пути будет слишком большой).
Поэтому, когда вы сталкиваетесь с слишком длинным путем, вам нужно перейти на максимально возможный уровень, переименовать его в односимвольное имя и повторить для каждого уровня в нем. Каждый раз, когда вы это делаете, общая длина пути сокращается на разницу между старым именем и новым именем.
Обратное также верно. Вы не можете создать путь, который больше максимальной поддерживаемой длины (в DOS и Windows, MAX_PATH = 260
). Тем не менее, вы можете переименовать каталоги, работая изнутри наружу, в более длинное имя. В результате более глубокие папки, абсолютный путь которых> 260, будут недоступны. (Это не делает их «скрытыми» или безопасными, поскольку к ним достаточно просто добраться, поэтому не используйте этот метод для скрытия файлов.)
Интересная сторона Примечание
Если вы создаете папки в Windows 7 Explorer, может показаться, что Explorer позволяет вам создавать подкаталоги так, чтобы общая длина была больше, чем MAX_PATH
фактически, но фактически она обманывает, используя «имена файлов DOS 8.3». Вы можете увидеть это, создав дерево, например:
C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\
Его длина составляет 696 символов, что, конечно, намного больше, чем 260. Кроме того, если вы переходите к самому внутреннему подкаталогу в Проводнике, он показывает его, как и ожидалось, в адресной строке, когда он не в фокусе, но когда вы щелкаете по адресу бар, он меняет путь C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\
, длина которого составляет всего 102 символа.
В XP он этого не делает, вместо этого он решительно отказывается создавать более длинный путь, чем поддерживается.
Что было бы действительно интересно, так это узнать, как Windows 7 Explorer обрабатывает «слишком длинные пути», когда эта NtfsDisable8dot3NameCreation
опция установлена.