Це насправді досить просто виправити. Скажіть, що структура каталогу така:
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 дозволяє створювати підкаталоги таким чином, що загальна довжина перевищує 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
параметр.