บนเครื่อง Windows ของฉันฉันมีโฟลเดอร์ที่มีชื่อของสี่จุดที่ทำหน้าที่เหมือนโพรงกระต่ายแบบนั้นเกิดขึ้นได้อย่างไร?


198

ชื่อโฟลเดอร์ได้เข้าจดทะเบียนใน File Explorer ....ที่มีเพียงแค่ธรรมดาสี่จุด

เมื่อฉันลองเปิดมันฉันก็เข้าสู่วงกระต่ายไม่มีที่สิ้นสุดที่ฉันเปิดโฟลเดอร์เดียวกันที่แน่นอนซ้ำแล้วซ้ำอีก - ฉันสามารถทำสิ่งนี้ไม่สิ้นสุด แสดงเส้นทางที่ชอบC:\ExamplePath\....\....\....\....\....ฯลฯ

มันแขวนรวบรวมของฉัน TypeScript ในโครงการเฉพาะ ฉันใช้เวลามากกว่าหนึ่งปีก่อนที่ฉันจะพบโฟลเดอร์นี้และปัญหาที่เกี่ยวข้องเนื่องจากมีการฝังรากลึกในโฟลเดอร์ที่ซ้อนกัน ฉันไม่เคยคาดหวังว่าจะมีปัญหาเช่นนี้ดังนั้นฉันจึงไม่เคยมองหามัน

ฉันไม่สามารถลบโฟลเดอร์ด้วยวิธีปกติได้เนื่องจากชื่อพิเศษ rd /s /q pathในท้ายที่สุดผมก็สามารถนำออกได้โดยใช้บรรทัดคำสั่งและการลบโฟลเดอร์ของพ่อแม่ด้วย

หลังจากนั้นฉันพยายามสร้างโฟลเดอร์อีกครั้ง แต่ไม่สามารถทำได้ทั้ง File Explorer และบรรทัดคำสั่ง

ใน 20 ปีที่ฉันใช้ Windows ฉันไม่เคยเห็นข้อผิดพลาดนี้มาก่อนดังนั้นฉันสามารถจินตนาการได้ว่ามันจะเป็นปัญหาที่น่ารำคาญและสับสนสำหรับผู้ใช้มือสมัครเล่น

ไม่มีใครรู้ว่าสิ่งนี้อาจเกิดขึ้นและวิธีการทำซ้ำปัญหานี้ได้อย่างไร

ปรับปรุง

สำหรับผู้ที่สนใจเส้นทางนี้อยู่ลึกเข้าไปในโฟลเดอร์ TFS ดังนั้น TFS อาจใช้วิธีบายพาส @grawity อธิบาย ( "ตัวจัดการไฟล์ต่างๆผู้จัดเก็บ ฯลฯ " )

ฉันพบข้อผิดพลาด TFS ที่หายากหรือไม่


5
คำตอบด้านล่างนี้มีรายละเอียดว่ามีอะไรเกิดขึ้นวิธีการทำซ้ำโดยเจตนาและวิธีแก้ไข แต่ไม่ได้กล่าวถึงสาเหตุที่เกิดขึ้น เนื่องจาก..สามารถใช้ในพา ธ เพื่อระบุ 'ขึ้นหนึ่งโฟลเดอร์' ฉันจะเสี่ยงต่อการเดาว่ามีบางตำแหน่งตามบรรทัดโปรแกรมหรือสคริปต์บางตัวต่อกันสองสายเพื่อสร้างเส้นทางหนึ่งจบด้วย..และต่อไปก็เริ่มด้วย..และ เนื่องจากใช้หนึ่งในเทคนิคที่กล่าวถึงด้านล่างจึงประสบความสำเร็จในการสร้างเส้นทางแม้ว่าจะไม่มีตัวคั่นโฟลเดอร์ระหว่างพวกเขา
3D1T0R

6
สิ่งแปลก ๆ ก็จะเกิดขึ้นเช่นกันหากคุณสร้างโฟลเดอร์ที่มีช่องว่างเฉพาะในชื่อ
phuclv

7
เซิร์ฟเวอร์นี้อยู่บนอินเทอร์เน็ตหรือไม่ GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.iniเพียงแค่จะเตือนคุณฉันเป็นประจำเห็นความพยายามในการสับบนอินเทอร์เน็ตหันหน้าไปทางเว็บเซิร์ฟเวอร์ขอ: เห็นได้ชัดว่ามี / มีช่องโหว่บางอย่างที่ความพยายามดังกล่าวพยายามเอาเปรียบ
Andy Brown

4
@AndyBrown มีแนวโน้มมากขึ้นที่ไม่ได้.. ....มันเป็นเพียงวิธีการสำรวจ\winntโดยไม่คำนึงถึงความลึกของจุดเริ่มต้น (รูทเว็บ) ตราบใดที่จุดเริ่มต้นนั้นลึกน้อยกว่า 9 ระดับ ขึ้นอยู่กับความจริงที่ว่าการไป..จากไดเรกทอรีรากจะทำให้คุณอยู่ที่ไดเรกทอรีราก
hobbs

5
@ ฮอบส์นั่นคือการคัดลอกและวางจากล็อกการเข้าถึง Apache บน linux มี 4 จุดอย่างแน่นอน มีความพยายามสับเข้าสู่ระบบอื่นที่ไม่ใช้..ซึ่งเป็นเหตุผลที่ผมพบว่าคนนี้ค่อนข้างแปลก
แอนดี้บราวน์

คำตอบ:


303

Win32 ไม่อนุญาตให้คุณสร้างไฟล์หรือโฟลเดอร์ที่มีชื่อลงท้ายด้วย.- จุดทั้งหมดจะถูกแยกออกจากจุดสิ้นสุด พยายามที่จะสร้างtest.ทำให้testปรากฏแทน (นี่เป็นความเข้ากันได้กับชื่อ 8.3 ในซอฟต์แวร์ยุค DOS / Win9x เก่า)

ดังนั้นเมื่อใดก็ตามที่คุณพยายามเข้าถึงโฟลเดอร์ที่....มีชื่อชื่อนั้นจะถูกลดขนาดให้เป็นสตริงว่างและคุณจะกลับไปที่โฟลเดอร์ที่คุณเคยเข้ามาก่อน

อย่างไรก็ตามเคอร์เนล NT อนุญาตชื่อดังกล่าว มีกลไกต่าง ๆ ที่ข้ามข้อ จำกัด ชื่อไฟล์ที่กำหนดโดย Win32 APIs ตัวอย่างเช่น WSL (Windows Subsystem สำหรับ Linux) ไม่ทำงานบน Win32 และไม่ได้รับผลกระทบจากมัน นอกจากนี้ยังมี\\?\วิธีบายพาสซึ่งเป็น "แบ็คดอร์" ที่เหลือไว้สำหรับโปรแกรมที่ทราบว่าพวกเขากำลังทำอะไรอยู่ แม้ว่าคุณจะไม่สามารถสร้างได้C:\Example\....\แต่คุณสามารถสร้างได้\\?\C:\Example\....\ดี

ในทำนองเดียวกันคุณสามารถลบไดเรกทอรีดังกล่าวด้วยrmdir \\?\C:\path\...จาก Cmd (ฉันยังไม่ได้ทดสอบกับ PowerShell)

ตัวจัดการไฟล์ผู้จัดเก็บ ฯลฯ อาจใช้\\?\วิธีการนี้เพื่อให้สามารถใช้ชื่อพา ธ ที่ยาวกว่าปกติ - และโดยการทำเช่นนั้นพวกเขายังไม่ได้รับผลกระทบจากรหัสความเข้ากันได้ภายใน Win32; พวกเขาหลีกเลี่ยงการจุดลอกเช่นเดียวกับการแปลของชื่อไฟล์มายากลเหมือนหรือCONNUL

ดังนั้นอาจเป็นหนึ่งในโปรแกรมของคุณ:

  1. ใช้\\?\เพื่อเข้าถึงไฟล์เสมอ
  2. พยายามสร้างโฟลเดอร์ชื่อโดยบังเอิญ....แต่ไม่สามารถทราบได้อย่างแน่นอนหลังจากข้อเท็จจริง

13
อีกวิธีในการสร้างโฟลเดอร์ดังกล่าวคือการใช้สตรีมข้อมูลสำรอง echo "" > ....::$INDEX_ALLOCATIONเกี่ยวกับคำสั่งนี้ สิ่งนี้จะสร้างชื่อโฟลเดอร์....(ยังคงชี้ไปที่โฟลเดอร์ปัจจุบัน)
WorldSEnder

2
@DirkBoer ฉันพบสิ่งนี้: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389

124
Microsoft เรียกสิ่งนี้ว่า "คำนำหน้าเส้นทางแบบขยาย" และเส้นทางที่มีคำนำหน้านั้นจะเรียกว่า "เส้นทางแบบขยายความยาว" (ตลก: เมื่อคุณค้นหา\\?\"ในแหล่งข้อมูลอ้างอิง . NET ทำให้เกิดข้อผิดพลาดรันไทม์บนเซิร์ฟเวอร์ของพวกเขา)
dlatikay

2
@grawity ดังนั้น . . ฉันจะไปลบโฟลเดอร์นี้ได้อย่างไร?
Shadow503

21
ฉันมีกรณีลูกค้า 'ซ่อมคอมพิวเตอร์' ที่อยากรู้อยากเห็นเมื่อใดก็ตามที่ลูกค้าทำบัญชีบนเครื่อง windows ใด ๆ มันจะทำงานได้ดี แต่เมื่อเขาเข้าสู่ระบบ / รีบูตมันจะไม่ปล่อยให้เขาเข้าสู่บัญชีของเขาแทนการสร้างบัญชีชั่วคราวสำหรับ เซสชั่น ร้านซ่อมเครื่องคอมพิวเตอร์ในพื้นที่ก็หยุดนิ่ง เปลี่ยนชื่อจริงของเขาคือ Con & เขามักจะใช้ชื่อของเขาสำหรับบัญชี windows ของเขา ..... ในวันนั้นฉันได้เรียนรู้ว่ามีcom1ชื่อไฟล์มายากลมากกว่า
RozzA

23

นอกเหนือจากคำตอบของ @ grawity แล้วโปรแกรม Win32 ยังสามารถทำได้โดยเรียก API "ดั้งเดิม" โดยตรง ถ้าฉันไม่เข้าใจผิดในกรณีปัจจุบันนั่นจะเป็น NtCreateDirectoryObject การเรียกเหล่านั้นมีการบันทึกค่อนข้างดีในปัจจุบันโดยเฉพาะอย่างยิ่งเคอร์เนลคู่ (ซึ่งคุณไม่สามารถโทรจากโปรแกรม Win32) ในกรณีนี้ ZwCreateDirectoryObject

เกี่ยวกับ "ความลึกที่ไม่มีที่สิ้นสุด" วิธีง่ายๆในการบรรลุเป้าหมายนี้คือการใช้ลิงก์ สร้างไดเรกทอรีจากนั้นสร้างไดเรกทอรีแยกไว้ข้างใน (คุณสามารถใช้mklink /jเป็นตัวอย่างได้) และคุณจะได้โครงสร้างที่ลึกมาก ครั้งสุดท้ายที่ฉันทำสิ่งนี้คือใน Windows 2000 มีการยุติการสอบถามซ้ำ (คุณไม่สามารถ "ขุดไม่สิ้นสุด") อาจเป็นไปได้ว่าระบบปฏิบัติการที่ใหม่กว่านั้นขีด จำกัด นั้นใหญ่กว่าหรือถูกลบออกไปนอกจากนี้คุณสามารถสร้างสมมติว่า 10 ไดเรกทอรีแต่ละอันเป็นลูกของรุ่นก่อนหน้าและในอันดับที่ 10 ให้สร้างลิงค์กลับไปยังไดเรกทอรีแรก


4
นั่นอาจเป็นวัตถุอัจฉริยะที่ชั่วร้ายมาก ...
Agi Hammerthief

1
ฉันได้คัดลอกไดเรกทอรีเต็มรูปแบบเช่นนี้เพื่อเติมดิสก์ปลอมเพื่อทดสอบความสามารถในการพิจารณาว่าเมื่อใดที่ใกล้ถึงขีด จำกัด ที่กำหนดไว้
mickeyf

เป็นไปได้ที่จะทำซ้ำโดยใช้ cygwin'smkdir ....
lucidbrot

18

มีวิธีที่ง่ายกว่าในการสร้างไดเรกทอรี จากประเภทพรอมต์คำสั่ง:

MD ....\

และกด Enter มันจะสร้างไดเรกทอรีที่มีสี่จุด ไดเรกทอรีนี้ยังสามารถดูได้ด้วย explorer

มีข้อบกพร่องใน MS-DOS ที่กลับไปเป็นรุ่น 1.0 MS ทราบมาบ้างแล้ว แต่ไม่สามารถแก้ไขได้ พวกเขาได้แก้ไขปัญหาด้วย PowerShell

BTW ถ้าคุณลอง:

RD ....

มันจะล้มเหลวในการลบ คุณต้องใช้ไวยากรณ์เฉพาะนี้เพื่อลบมัน

RD ....\

ฉันใช้สิ่งนี้กับเซิร์ฟเวอร์บางตัวที่ฉันเป็นผู้ดูแล ฉันมักจะสร้างโฟลเดอร์ผู้ใช้บนรูทของดิสก์และฉันไม่ต้องการให้ผู้ดูแลระบบรายอื่นเข้ามาและลบออก

ดังนั้นฉันจะเข้าไปในโฟลเดอร์และสร้างโฟลเดอร์ย่อยชื่อ CON, AUX หรือ LPT ฯลฯ ...

หากผู้ดูแลระบบคนอื่นต้องการลบโฟลเดอร์ของฉันพวกเขาจำเป็นต้องรู้วิธีลบโฟลเดอร์ย่อยนี้ก่อน

แก้ไข: ฉันกำลังคิดเกี่ยวกับการสนทนาเมื่อเช้านี้และฉันตัดสินใจที่จะก้าวไปอีกขั้นหนึ่ง ฉันถือว่า mods จะตัดสินใจว่าสิ่งนี้เกี่ยวข้องหรือไม่

ฉันไม่สามารถซีดีไปยังโฟลเดอร์ได้

พิจารณาถ้าฉัน MD c: \ test จากนั้นซีดี C: \ test และ MD .... \ ฉันท้ายด้วย C: \ test ....

และทั้งหมดเป็นอย่างดี

แต่ซีดี .... ล้มเหลวและเตะฉันกลับไปที่ C: \ test (ซีดี .... \ ทำเช่นเดียวกัน)

อย่างไรก็ตามฉันสามารถ DIR .... และรับรายชื่อ dir ฉันยังสามารถ

MD C: \ test .... \ temp และสร้าง sub-dir ใน ....

ฉันยังสามารถ CD C: \ test .... \ temp และเข้าไปในไดเรกทอรีย่อยนั้น

แต่ในขณะที่อยู่ใน C: \ test .... \ temp ถ้าฉันเป็นซีดี .. ฉันกลับมาที่ C: \ test

ฉันไม่สามารถ cd ลงในไดเรกทอรีนั้น แต่ฉันสามารถจัดการโฟลเดอร์ด้วยการสร้างโฟลเดอร์ย่อยและน่าสนใจพอ

ECHO "การทดสอบ" >> C: \ test .... \ test.txt

ยังใช้งานได้และสร้างไฟล์ในโฟลเดอร์นั้น ดังนั้นฉันสามารถสร้างโฟลเดอร์ที่มีสี่จุดฉันสามารถเพิ่มไฟล์และโฟลเดอร์ลงในนั้นฉันจะได้รายชื่อของมัน แต่ฉันไม่สามารถใส่ซีดีลงไปได้ มีอัจฉริยะที่ชั่วร้ายบางอย่างที่ใช้สำหรับสิ่งนี้หรือไม่? ฉันขอโทษ mods ถ้าฉันหลงทางไปไกลเกินไป


6
นั่นดูเหมือนจะเป็นข้อบกพร่อง Win32 API เนื่องจากพรอมต์คำสั่งไม่ได้เป็น "MS-DOS" อีกต่อไปประมาณยี่สิบปีแล้ว
grawity

2
ที่น่าสนใจถ้าฉันพยายามลบไดเรกทอรีใน windows explorer มันจะล้มเหลวเมื่อฉันสร้างมันด้วยรุ่นของคุณ เมื่อฉันสร้างมันด้วย cygwin มันก็ล้มเหลวและพูดอย่างนั้น
lucidbrot

ฉันมีเครื่อง DOS 3.3 และเครื่อง DOS 6.0 และคำสั่งนั้นใช้งานได้ เมื่อพวกเขาเปลี่ยนเป็น 32 บิตปัญหายังคงอยู่ที่นั่น มันทำงานได้ในหน้าต่าง CMD จาก win95 จนถึงทุกวันนี้รวมถึงเซิร์ฟเวอร์ทุกรุ่น ตอนนี้เรากำลังเปลี่ยนไปใช้ Powershell แล้วมันไม่ทำงานอีกต่อไป ฉันรู้หลังจากเขียนว่ามันสร้างไดเรกทอรี แต่มันไม่ได้ให้ผลที่ OP เห็น ถ้าฉันลองซีดีลงในไดเรกทอรีที่มีจุดสี่จุดเพียงแค่เตะฉันกลับออกไป
Larryc

บนเครื่อง Windows 7 ของฉันMD ....` only creates .... \ .... `แผนผัง - มีเพียงขั้นตอนเดียวในการเรียกซ้ำ
Tomáš Zato

ผู้จัดการ FARอยากรู้อยากเห็นไม่เห็นสิ่งนี้เป็นพิเศษในทางใดทางหนึ่งและสร้าง / เปลี่ยนชื่อ / ลบ / แสดงรายการเนื้อหาของไดเรกทอรีชื่อ "จุดจำนวนมาก" โดยไม่มีปัญหาเลย
RomanSt

-1

ฉันมีปัญหาเดียวกัน. ในกรณีของฉันมันเป็นคำสั่งพิมพ์ผิดสำหรับ. NET Core ที่เผยแพร่:

dotnet publish "Api.csproj" --output "....\output\"

มันสร้างไดเรกทอรีด้วยชื่อ '.... ' ซึ่งฉันไม่สามารถลบหรือเปลี่ยนชื่อได้ ไดเรกทอรีนี้ทำหน้าที่เหมือนกับการอ้างอิงไปยังไดเรกทอรีหลัก หากฉันเข้าไปในโฟลเดอร์นั้นฉันยังอยู่ในโฟลเดอร์หลัก แต่พา ธ ถูกต่อท้ายด้วย '.... \'

ฉันลองคำสั่งทั้งหมดที่กล่าวถึงในหัวข้อนี้ แต่ไม่มีคำสั่งใดที่ทำงานได้ ในความเข้าใจของฉันมันทำหน้าที่เช่นนั้นเพราะฉันมีไฟล์และไดเรกทอรีอื่นในไดเรกทอรีหลักดังนั้นฉันต้องใช้พารามิเตอร์ที่สามารถลบเนื้อหาทั้งหมดซ้ำ ๆ

ฉันพบว่าคำสั่งนี้:

rmdir /s /q ....\

สามารถลบไดเรกทอรี '.... ' มันจะลบการอ้างอิงไปยังไดเรกทอรีหลักเท่านั้นซึ่งไดเรกทอรี '.... ' นี้จริง ๆ แล้วไม่มีอะไรมากไม่มีอะไรน้อย แม้จะมีข้อโต้แย้งคำสั่ง:

  • / s - ลบเนื้อหาทั้งหมดภายในไดเรกทอรีที่ถูกลบ
  • / q - ลบโดยไม่มีการยืนยัน

ไดเรกทอรีหลักยังคงไม่ถูกแตะต้อง


คุณช่วยอธิบายได้ไหมว่าทำไมคำสั่งที่สองถึงทำงานให้คุณ?
Burgi

การลงคะแนนเนื่องจากคุณไม่ได้ให้คำอธิบายใด ๆ ว่าทำไมคำสั่งทำงานหรือสิ่งที่มันทำเช่นลบไดเรกทอรีไดเรกทอรีย่อยและไฟล์
Winter Faulk

นี่เป็นการลบไดเรกทอรีด้วยชื่อ '.... ' มันจะลบการอ้างอิงไปยังไดเรกทอรีหลักเท่านั้นซึ่งไดเรกทอรี '.... ' นี้จริง ๆ แล้วไม่มีอะไรมากไม่มีอะไรน้อย ฉันลองคำสั่งทั้งหมดที่กล่าวถึงในหัวข้อนี้ แต่ก็ไม่สามารถใช้งานได้ ในความเข้าใจของฉันคำสั่งนี้ใช้ได้เพราะฉันมีไฟล์และไดเรกทอรีอื่นในไดเรกทอรีหลักดังนั้นฉันต้องใช้พารามิเตอร์ที่สามารถลบเนื้อหาทั้งหมดซ้ำ ๆ แม้จะมีอาร์กิวเมนต์คำสั่งไดเรกทอรีหลักยังคงไม่มีการแตะต้อง
Mateusz

ฉันได้เข้าสู่สถานการณ์เดียวกันนี้ด้วย Visual Studio และคำสั่งนี้ช่วยเบคอนของฉันหลังจากชั่วโมงแห่งความไม่พอใจที่พยายามคิดว่าเกิดอะไรขึ้น
NPNelson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.