ความแตกต่างระหว่างฟอร์เวิร์ดสแลช (/) และแบ็กสแลช (\) ในพา ธ ไฟล์


153

ฉันสงสัยเกี่ยวกับความแตกต่างระหว่าง\และ/ในพา ธ ไฟล์ ฉันได้สังเกตเห็นว่าบางครั้งมีเส้นทางและบางครั้งก็อยู่กับ/\

มันจะดีถ้าใครสามารถอธิบายได้ว่าเมื่อมีการใช้งานและ\/


4
ความแตกต่างในบริบทอะไร บริบท webby? หนีในสตริง C #? มันถูกติดแท็กด้วย ASP.NET
Peter Mortensen


6
@ ปีเตอร์ฉันจะปิดพี่ที่มีความสามารถนี้เนื่องจากมีคำตอบที่ดีกว่า
nicael

6
เป็นอย่างไรC #และasp.netที่เกี่ยวข้องกับคำถาม?
Oriol

2
@zzzzBov เหตุใดจึงไม่เปลี่ยนเส้นทางไปยังรุ่นเก่าและคำตอบที่ดีกว่าอยู่ที่นั่น ฉันไม่ชอบระบบที่คำถามที่ฉันถามอาจถูกปิดในอนาคตอันไกลในฐานะ "ซ้ำ" ของสิ่งที่เกิดขึ้นในภายหลัง อย่างน้อยก็เรียกมันว่าอะไรที่สื่อความหมายมากกว่าเช่น "แทนที่" แทนที่จะเป็นคำซ้ำ ต้นฉบับ "หนึ่ง" ไม่สามารถซ้ำกันได้ แต่เป็นเพียงฉบับเดียว

คำตอบ:


248

/เป็นตัวคั่นพา ธ บนระบบที่เหมือน Unix และ Unix Windows รุ่นใหม่โดยทั่วไปสามารถใช้ทั้งสองอย่าง\และ/สลับกันได้สำหรับพา ธ ไฟล์ แต่ Microsoft ได้สนับสนุนให้ใช้\เป็นตัวคั่นพา ธ มานานหลายทศวรรษ

สิ่งนี้ถูกทำขึ้นด้วยเหตุผลทางประวัติศาสตร์ซึ่งย้อนหลังไปจนถึงทศวรรษ 1970 ซึ่งเป็นช่วงก่อนหน้าของ Windows มากกว่าทศวรรษ ในการเริ่มต้น MS-DOS (รากฐานถึง Windows รุ่นแรก ๆ ) ไม่สนับสนุนไดเรกทอรี Unix มีการรองรับไดเรกทอรีโดยใช้/ตัวอักษรตั้งแต่ต้น อย่างไรก็ตามเมื่อเพิ่มไดเรกทอรีใน MS-DOS 2.0, Microsoft และ IBM ได้ใช้/อักขระสำหรับสวิตช์คำสั่งแล้วและเนื่องจาก parser ที่มีน้ำหนักเบาของ DOS (สืบเชื้อสายมาจากQDOSออกแบบมาเพื่อทำงานบนฮาร์ดแวร์ระดับล่างสุด) พวกเขาไม่พบ วิธีที่เป็นไปได้ในการใช้/อักขระโดยไม่ทำลายความเข้ากันได้กับแอปพลิเคชันที่มีอยู่

ดังนั้นเพื่อหลีกเลี่ยงข้อผิดพลาดเกี่ยวกับ "ขาดสวิตช์" หรือ "สวิตช์ไม่ถูกต้อง" เมื่อส่งไฟล์พา ธ เป็นอาร์กิวเมนต์ไปยังคำสั่งเช่น:

cd/                        <---- no switch specified
dir folder1/folder2        <---- /folder2 is not a switch for dir

มีการตัดสินใจแล้วว่า\จะใช้อักขระแทนดังนั้นคุณสามารถเขียนคำสั่งเหล่านี้ได้

cd\
dir folder1\folder2

โดยไม่มีข้อผิดพลาด

ต่อมาไมโครซอฟท์และไอบีเอ็มร่วมมือกับระบบปฏิบัติการที่ไม่เกี่ยวข้องกับ DOS เรียกว่าOS / 2 OS / 2 มีความสามารถในการใช้ตัวคั่นทั้งสองซึ่งอาจดึงดูดนักพัฒนาระบบยูนิกซ์ได้มากกว่า เมื่อMicrosoft และ IBM แยกทางกันในปี 1990 Microsoft ได้ใช้รหัสใดที่พวกเขามีและสร้างWindows NTซึ่งเป็น Windows รุ่นที่ทันสมัยทุกรุ่น


เนื่องจากความเข้ากันได้ย้อนหลังเป็นชื่อของเกมสำหรับ Microsoft จากการเปลี่ยนระบบปฏิบัติการที่สำคัญทั้งหมดที่พวกเขาได้ดำเนินการ (DOS เป็น Win16 / DOS, Win16 / Win32, เป็น Win32 / WinNT) ลักษณะเฉพาะนี้ติดอยู่และอาจจะ มีอยู่พักหนึ่ง

ด้วยเหตุผลนี้เองที่ความแตกต่างนี้มีอยู่ มันน่าจะไม่มีผลกับสิ่งที่คุณทำเพราะอย่างที่ฉันพูด WinAPI สามารถใช้แทนกันได้ อย่างไรก็ตามแอปพลิเคชันของบุคคลที่สามอาจแตกถ้าคุณผ่าน/เมื่อพวกเขาคาดหวังว่า\ระหว่างชื่อไดเรกทอรี หากคุณกำลังใช้ Windows \อยู่ หากคุณกำลังใช้ระบบปฏิบัติการยูนิกซ์หรือURI s (ซึ่งมีพื้นฐานของพวกเขาในเส้นทาง Unix, แต่ที่เรื่องอื่นทั้งหมด) /จากนั้นใช้


ในบริบทของ C #:ควรสังเกตเนื่องจากเป็นคำถามทางเทคนิคว่าถ้าคุณต้องการเขียนรหัส C # แบบพกพาที่ทำงานได้กับทั้ง Unix และ Windows (แม้ว่า C # จะเป็นภาษา Windows เป็นหลัก) อาจต้องการใช้Path.DirectorySeparatorCharฟิลด์เพื่อให้โค้ดของคุณใช้ตัวคั่นที่ต้องการบนระบบนั้นและใช้Path.Combine()เพื่อต่อท้ายพา ธ อย่างถูกต้อง


57
และรวมเส้นทางโดยใช้Path.Combineเสมอ
เฉินเฉิน

1
น่าสนใจ ดังนั้นภายใต้ DOS หรือ Windows foo.exe /barอาจถูกตีความว่าเป็นสวิตช์บรรทัดคำสั่งในขณะที่foo.exe \barอาจถูกตีความว่าเป็นการอ้างอิงถึงไฟล์ / โฟลเดอร์ที่เรียกว่าbarซึ่งตั้งอยู่ในไดเรกทอรีราก\ของ "ไดรฟ์" ปัจจุบันC:\เช่น
Jeppe Stig Nielsen

4
มันควรจะตั้งข้อสังเกตว่าการฟื้นฟูนี้จากการ/ที่จะ\ มีการทำใน Win32 compat ชั้นหมายความว่าถ้าคุณหลีกเลี่ยงมันจะมีความแตกต่าง ตัวอย่างที่รู้จักกันดีที่สุดคือเส้นทางความยาวแบบขยาย: \\?\C:\ จะทำงานได้ตามที่คาดไว้ใน NTFS แต่\\?\C:/จะไม่ทำงาน
Voo

4
@PC Luddite: WinAPI นั้นสามารถจัดการได้ทั้งสอง/และ` is not entirely true. For network path you have to use `(เช่น \\ <servername> bot not // <servername>)
raznagul

2
@raznagul True ฉันไม่ได้พูดถึงเส้นทางเครือข่ายในคำตอบของฉัน ฉันติดอยู่กับประเภทไฟล์พา ธ ทั่วไป ฉันจะเพิ่มที่
พีซี Luddite

20

MS-DOS 1.0รักษารูปแบบตัวเลือกบรรทัดคำสั่ง (หรือสวิตช์) ของ '/' จาก CP / M ในเวลานั้นไม่มีโครงสร้างไดเรกทอรีในระบบไฟล์และไม่มีข้อขัดแย้ง

เมื่อ Microsoft พัฒนา Unix like environment ขึ้นด้วย MS-DOS (และ PC-DOS) 2.0 พวกเขาจำเป็นต้องแสดงถึงตัวคั่นพา ธ โดยใช้บางสิ่งที่ไม่ขัดแย้งกับตัวเลือกบรรทัดคำสั่งที่มีอยู่ ภายในระบบทำงานได้ดีเท่าเทียมกันกับ '/' หรือ '\' ตัวประมวลผลคำสั่ง (และแอปพลิเคชันจำนวนมาก) ยังคงใช้ '/' เป็นอักขระสวิตช์

CONFIG.SYSรายการSWITCHAR=-สามารถนำมาใช้แทนที่การ/เริ่มต้นในการปรับปรุงการทำงานร่วมกัน Unix สิ่งนี้ทำให้คำสั่งในตัวและยูทิลิตี้มาตรฐานใช้อักขระทางเลือก ตัวคั่นพา ธ Unix นั้นสามารถใช้ได้อย่างไม่น่าสงสัยสำหรับชื่อไฟล์และไดเรกทอรี รายการนี้ถูกลบในรุ่นที่ใหม่กว่า แต่มีการบันทึกการโทร DOS เพื่อตั้งค่าหลังจากการบูท

นี่เป็นเพียงเล็กน้อยที่ใช้และเครื่องมือของบุคคลที่สามส่วนใหญ่ยังคงไม่เปลี่ยนแปลง ความสับสนยังคงอยู่ พอร์ตของเครื่องมือ Unix จำนวนมากเก็บอักขระ '-' สวิตช์ไว้ในขณะที่บางตัวรองรับทั้งอนุสัญญา

ตัวประมวลผลคำสั่งที่ตามมาของ PowerShell ใช้การหลบหนีอย่างเข้มงวดและสลับพารามิเตอร์และหลีกเลี่ยงความสับสนส่วนใหญ่ยกเว้นที่ใช้เครื่องมือดั้งเดิม

คำถามและคำตอบไม่เกี่ยวข้องกับ C #


2
ในฐานะที่เป็นบันทึกประวัติศาสตร์การใช้/เป็นตัวเลือกผู้แนะนำในระบบปฏิบัติการ PDP-11 เช่น RSTS (1970) และ RSX (1972) นำหน้าว่าใน CP / M (1973)
PJTraill

9

บนระบบที่ใช้ Unix \เป็นตัวหนี (escape character) นั่นคือ\บอกตัวแยกวิเคราะห์ว่านี่เป็นช่องว่างไม่ใช่จุดสิ้นสุดของคำสั่ง บนระบบ Unix /เป็นตัวคั่นไดเรกทอรี

บน Windows \เป็นตัวคั่นไดเรกทอรี แต่/ไม่สามารถใช้ในชื่อไฟล์หรือไดเรกทอรี


1
\ และ/(รวมถึงสัญลักษณ์อื่น ๆ อีกมากมาย) ไม่สามารถใช้ในชื่อไฟล์ได้เนื่องจาก DOS ไม่มีตัวแยกวิเคราะห์ที่ซับซ้อนเหมือนกับที่ผู้ใช้ Unix คุ้นเคย การขาดตัวแยกวิเคราะห์ที่ดีคือผลลัพธ์ของ MS-DOS ที่สืบเชื้อสายมาจาก QDOS ("ระบบปฏิบัติการที่รวดเร็วและสกปรก") มันหมายถึงการทำให้สิ่งต่าง ๆ ทำงานได้อย่างรวดเร็วและบนฮาร์ดแวร์ที่ จำกัด แน่นอนว่าทั้งหมดนี้ยังคงมีอยู่ในยุคปัจจุบันสำหรับความเข้ากันได้แบบย้อนหลัง
พีซี Luddite

2
ดีมูลค่าการกล่าวขวัญว่าในรุ่นที่ใหม่กว่าของ Windows /ถูกเพิ่มเป็น "Alternate_Directory_Separator"
Tomer W

@PCLuddite บางทีเราควรคิดถึงความเข้ากันได้ไปข้างหน้าแทน?

1
@nocomprende สิ่งที่เกี่ยวกับ filepaths ไม่เข้ากัน? เข้ากันไม่ได้กับอะไร และอย่างที่ฉันพูดไว้ก่อนหน้าการบันทึก "แอพ DOS สองสามตัว" (ซึ่งเหมือนจริงนับพัน) จากการแตกเป็นสิ่งสำคัญสำหรับผู้บริโภคในเวลานั้น นี่คือสิ่งที่ทำให้ Microsoft ประสบความสำเร็จในวันนี้และ Unix (และอื่น ๆ ทั้งหมด) เริ่มต้นจากการลดลง (แม้ว่าจะมีการฟื้นตัวในช่วงทศวรรษที่ผ่านมา) ฉันล้มเหลวที่จะดูว่ามันไม่ได้ดูด้วยความรู้สึกสามัญ
PC Luddite

1
@nocomprende และการโต้แย้งของคุณเกี่ยวกับ filepath ที่ไม่ได้มาตรฐานนั้นเป็นโมฆะอย่างสมบูรณ์ พวกเขากำลังสร้างมาตรฐานบน Windows และพวกเขากำลังมาตรฐานบน Unix หากคุณกำลังพูดถึงมาตรฐานข้ามแพลตฟอร์มนั่นไม่ใช่สิ่งที่มีประโยชน์หรือใช้งานง่าย ใครจะบอกว่ามาตรฐานเดียวดีกว่าอีกมาตรฐานจริงหรือ
PC Luddite

8
  • URL ที่เป็นมาตรฐานใน RFC 1738 จะใช้เครื่องหมายทับซ้ายเสมอโดยไม่คำนึงถึงแพลตฟอร์ม
  • เส้นทางของไฟล์และ URI นั้นแตกต่างกัน \ถูกต้องในพา ธ ไฟล์ Windows และ/ถูกต้องใน URI
  • เบราว์เซอร์หลายตัว (เช่น Firefox & Opera) ล้มเหลวอย่างรุนแรงเมื่อพบ URIs ด้วยแบ็กสแลช
  • System.IO.Path.DirectorySeparatorChar เพื่อรับตัวแยกเส้นทางปัจจุบัน

นี่อาจเป็นทรัพยากรที่เกี่ยวข้อง


10
ล้มเหลวอย่างหายนะ? Firefox แปล\​​เป็น/อัตโนมัติ ในหนังสือของฉันนี้เรียกว่า "ทำงานได้อย่างราบรื่น"
Kroltan

22
บ้านของฉันถูกไฟไหม้ครั้งล่าสุดที่ฉันใช้ \ ใน Firefox
user3163495

1
@CarstenS, Firefox ไม่แปลงแบ็กสแลชเพื่อส่งต่อสแลชใน URL โดยอัตโนมัติและไม่เปิดลิงก์ ส่วนเสริมนี้แก้ไข URL ด้วยแบ็กสแลชและหน้าเปิด addons.mozilla.org/en-US/seamonkey/addon/…
Sami

คุณหมายถึงอะไรโดยการ "ล้มเหลวอย่างหายนะ"? เกิดอะไรขึ้น? เบราว์เซอร์หยุดทำงานและออกหรือไม่
Peter Mortensen

7

นอกเหนือจากคำตอบที่ให้มาแล้วมันก็คุ้มค่าที่จะกล่าวถึงซึ่ง\ใช้กันอย่างแพร่หลายสำหรับตัวละครพิเศษ (เช่น\n \t ) ในภาษาโปรแกรมตัวแก้ไขข้อความ

หากคุณกำลังเขียนโปรแกรมเป็นต้นบางครั้งก็ไม่สะดวกที่จะต้องหลบเลี่ยงแบ็กสแลชด้วยอีกอันหนึ่ง ( \\) เพื่อใช้งานอย่างถูกต้องหรือต้องใช้สตริงที่ใช้ Escape เช่น C #@"\test" #

แน่นอนดังที่ได้กล่าวมาก่อนหน้านี้ URIs ของเว็บใช้เครื่องหมายสแลชตามมาตรฐาน แต่เครื่องหมายทับทั้งสองทำงานในเครื่องมือบรรทัดคำสั่งล่าสุดและที่พบบ่อยที่สุด.

UPDATE: หลังจากค้นหาเพียงเล็กน้อยดูเหมือนว่าเรื่องราวทั้งหมดระหว่าง/และ\ย้อนกลับไปใน "ประวัติคอมพิวเตอร์" ในยุคของ DOS และระบบที่ใช้ Unix ในเวลานั้น HowToGeekมีบทความที่น่าสนใจเกี่ยวกับเรื่องนี้

ในระยะสั้น DOS 1.0 เริ่มวางจำหน่ายครั้งแรกโดย IBM โดยไม่มีการสนับสนุนไดเร็กทอรีและ/ใช้สำหรับฟังก์ชันการทำงานคำสั่งอื่น ("การสลับ") เมื่อไดเรกทอรีที่ถูกนำมาใช้ในรุ่น 2.0 ที่มีอยู่แล้วในการใช้งานเพื่อให้ไอบีเอ็มเลือกที่สัญลักษณ์ที่อยู่ใกล้สายตาซึ่งเป็น/ \ในทางตรงกันข้าม Unix ใช้มาตรฐาน/สำหรับไดเรกทอรี

เมื่อผู้ใช้เริ่มใช้ระบบที่แตกต่างกันพวกเขาเริ่มสับสนทำให้นักพัฒนาระบบปฏิบัติการพยายามทำให้ระบบทำงานในทั้งสองกรณี - สิ่งนี้ใช้กับส่วนของ URL ด้วยเนื่องจากเบราว์เซอร์บางตัวสนับสนุนhttp: \\ www.testรูปแบบcom \ go สิ่งนี้มีข้อเสีย แต่โดยทั่วไป แต่สิ่งทั้งหมดนี้ยังคงมีอยู่ในปัจจุบันสำหรับสาเหตุด้านความเข้ากันได้แบบย้อนกลับด้วยความพยายามในการสนับสนุนทั้งเครื่องหมายสแลชบน Windows แม้ว่าจะไม่ได้ใช้ DOS อีกต่อไป


"เครื่องหมายทับทั้งสองทำงานในเส้นทางของระบบแฟ้ม" ไม่ถูกต้องเนื่องจาก Unix ค่อนข้างโกรธเมื่อคุณใช้` as well as many make` shells ... คุณถูกต้องที่ Windows ล่าสุดได้กำหนดตัวแปรสภาพแวดล้อม ALTERNATE_PATH_SEPARATOR ซึ่งเป็นค่าเริ่มต้นซึ่ง/Windows อาจยอมรับทั้งสองอย่างได้
Tomer W

1
@TomerW Windows NT รองรับ POSIX ได้เสมอ (แม้ว่า POSIX ก่อนหน้านี้จะมีความยุ่งเหยิงอยู่แล้วและบางส่วนก็ติดอยู่ใน Windows สำหรับความเข้ากันได้ย้อนหลัง) ซึ่งรวมถึง/เส้นทางการสนับสนุนทุกที่ในระบบ - แน่นอนว่าแอปพลิเคชันอาจเข้าใจผิดเส้นทางเหล่านั้นในยามว่างดังนั้นจึงไม่ได้ใช้มากเกินไป แอปพลิเคชันที่ไม่ใช่ CLI ที่ไม่ได้พยายามตรวจสอบเส้นทางของตัวเอง (ใช้งานไม่ได้) ของตัวเองทำงานได้ดีตั้งแต่เริ่มต้น
Luaan

@Luaan Windows มีความสามารถในการรองรับฟีเจอร์ POSIX มากมาย แต่ฉันแทบจะไม่พูดว่ามันเป็น "POSIX-compatible" แน่นอนว่ามีระบบย่อย POSIX อยู่สองสามระบบที่สามารถใช้ได้ในช่วงหลายปีที่ผ่านมา Windows 10 จะรองรับ Ubuntu ทุบตีในช่วงฤดูร้อนนี้พร้อมด้วยการสนับสนุนพื้นเมืองสำหรับเครื่องมือ Linux ที่มาพร้อมกับ Ubuntu ดังนั้นคุณอาจโต้แย้งได้ว่าในอนาคต แต่แน่นอนคุณไม่สามารถพูดว่า "เสมอ"
พีซี Luddite

@Luaan เว้นแต่ "เข้ากันได้" คุณหมายถึง "cygwin works"
PC Luddite

@PCLuddite ไม่มันเข้ากันได้กับ POSIX.1c 100% นั่นไม่ได้หมายความว่าทุกการใช้งานยูนิกซ์ทำงานกับมัน - ใช้งานมากที่สุดยูนิกซ์เป็นไม่ตาม POSIX :)
Luaan

6

คุณไม่ควรใช้ทั้งใน C # คุณควรใช้ระดับPath นี่มีวิธีการที่เรียกPath.Combineว่าสามารถใช้ในการสร้างเส้นทางโดยไม่ต้องระบุตัวคั่น

ตัวอย่างการใช้งาน:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");

5

\ ใช้สำหรับพา ธ ไฟล์โลคัล Windows และพา ธ เครือข่ายดังเช่นใน:

C:\Windows\Temp\ หรือ \\NetworkSharedDisk\Documents\Archive\

/ เป็นสิ่งที่จำเป็นโดยมาตรฐาน URIs เช่นเดียวกับใน:

http://www.stackoverflow.com/


2
@NikhilVartak ฉันได้เพิ่มตัวอย่างแม้ว่าฉันคิดว่าคำตอบเริ่มต้นของฉันตอบคำถามทุกข้อของ OP แล้ว
Ash

3
Windows ยังจำ/เส้นทางได้ (อย่างน้อย 7 ตัว)
Kenneth K.

คำตอบนี้ยังไม่สมบูรณ์
reinierpost

คุณตั้งใจจะลิงก์ไปยังแหล่งข้อมูลอื่นนอกเหนือจากหน้าหลักของ Stack Overflow หรือไม่?
Tas

@reierierpost คำตอบของฉันขึ้นอยู่กับคำถามของ OP และแท็กที่เกี่ยวข้อง เช่นเดียวกับคำตอบอื่น ๆ ที่นี่ฉันสามารถคัดลอกบางอย่างจากstackoverflow.com/questions/1589930/…และวางที่นี่ แต่ดูเหมือนจะมากเกินไป @tas ฉันตั้งใจที่จะเชื่อมโยงไปยังหน้าสแต็คโอเวอร์โฟลว์หรือไฮเปอร์ลิงก์ของเว็บไซต์ใด ๆ เพื่อแสดงการใช้/URI ที่เป็นมาตรฐานดังที่ฉันได้ระบุไว้ในคำตอบ
Ash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.