บนเครื่อง 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.