อันที่จริงแล้วค่อนข้างง่ายในการแก้ไข สมมติว่าโครงสร้างไดเรกทอรีเป็นเช่นนี้:
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 มากนอกจากนี้หากคุณนำทางไปยังไดเรกทอรีย่อยด้านในสุดใน Explorer มันจะแสดงตามที่คาดหวังในแถบที่อยู่เมื่อไม่ได้อยู่ในโฟกัส แต่เมื่อคุณคลิกที่อยู่ แถบมันเปลี่ยนเส้นทางไป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
ตั้งค่าตัวเลือก