ฉันสงสัยเกี่ยวกับความแตกต่างระหว่าง\
และ/
ในพา ธ ไฟล์ ฉันได้สังเกตเห็นว่าบางครั้งมีเส้นทางและบางครั้งก็อยู่กับ/
\
มันจะดีถ้าใครสามารถอธิบายได้ว่าเมื่อมีการใช้งานและ\
/
ฉันสงสัยเกี่ยวกับความแตกต่างระหว่าง\
และ/
ในพา ธ ไฟล์ ฉันได้สังเกตเห็นว่าบางครั้งมีเส้นทางและบางครั้งก็อยู่กับ/
\
มันจะดีถ้าใครสามารถอธิบายได้ว่าเมื่อมีการใช้งานและ\
/
คำตอบ:
/
เป็นตัวคั่นพา ธ บนระบบที่เหมือน 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()
เพื่อต่อท้ายพา ธ อย่างถูกต้อง
Path.Combine
เสมอ
foo.exe /bar
อาจถูกตีความว่าเป็นสวิตช์บรรทัดคำสั่งในขณะที่foo.exe \bar
อาจถูกตีความว่าเป็นการอ้างอิงถึงไฟล์ / โฟลเดอร์ที่เรียกว่าbar
ซึ่งตั้งอยู่ในไดเรกทอรีราก\
ของ "ไดรฟ์" ปัจจุบันC:\
เช่น
/
ที่จะ\
มีการทำใน Win32 compat ชั้นหมายความว่าถ้าคุณหลีกเลี่ยงมันจะมีความแตกต่าง ตัวอย่างที่รู้จักกันดีที่สุดคือเส้นทางความยาวแบบขยาย: \\?\C:\
จะทำงานได้ตามที่คาดไว้ใน NTFS แต่\\?\C:/
จะไม่ทำงาน
/
และ` is not entirely true. For network path you have to use
`(เช่น \\ <servername> bot not // <servername>)
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 #
/
เป็นตัวเลือกผู้แนะนำในระบบปฏิบัติการ PDP-11 เช่น RSTS (1970) และ RSX (1972) นำหน้าว่าใน CP / M (1973)
บนระบบที่ใช้ Unix \
เป็นตัวหนี (escape character) นั่นคือ\
บอกตัวแยกวิเคราะห์ว่านี่เป็นช่องว่างไม่ใช่จุดสิ้นสุดของคำสั่ง บนระบบ Unix /
เป็นตัวคั่นไดเรกทอรี
บน Windows \
เป็นตัวคั่นไดเรกทอรี แต่/
ไม่สามารถใช้ในชื่อไฟล์หรือไดเรกทอรี
\
และ/
(รวมถึงสัญลักษณ์อื่น ๆ อีกมากมาย) ไม่สามารถใช้ในชื่อไฟล์ได้เนื่องจาก DOS ไม่มีตัวแยกวิเคราะห์ที่ซับซ้อนเหมือนกับที่ผู้ใช้ Unix คุ้นเคย การขาดตัวแยกวิเคราะห์ที่ดีคือผลลัพธ์ของ MS-DOS ที่สืบเชื้อสายมาจาก QDOS ("ระบบปฏิบัติการที่รวดเร็วและสกปรก") มันหมายถึงการทำให้สิ่งต่าง ๆ ทำงานได้อย่างรวดเร็วและบนฮาร์ดแวร์ที่ จำกัด แน่นอนว่าทั้งหมดนี้ยังคงมีอยู่ในยุคปัจจุบันสำหรับความเข้ากันได้แบบย้อนหลัง
/
ถูกเพิ่มเป็น "Alternate_Directory_Separator"
\
ถูกต้องในพา ธ ไฟล์ Windows และ/
ถูกต้องใน URIนี่อาจเป็นทรัพยากรที่เกี่ยวข้อง
\
เป็น/
อัตโนมัติ ในหนังสือของฉันนี้เรียกว่า "ทำงานได้อย่างราบรื่น"
นอกเหนือจากคำตอบที่ให้มาแล้วมันก็คุ้มค่าที่จะกล่าวถึงซึ่ง\
ใช้กันอย่างแพร่หลายสำหรับตัวละครพิเศษ (เช่น\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 อีกต่อไป
` as well as many
make` shells ... คุณถูกต้องที่ Windows ล่าสุดได้กำหนดตัวแปรสภาพแวดล้อม ALTERNATE_PATH_SEPARATOR ซึ่งเป็นค่าเริ่มต้นซึ่ง/
Windows อาจยอมรับทั้งสองอย่างได้
/
เส้นทางการสนับสนุนทุกที่ในระบบ - แน่นอนว่าแอปพลิเคชันอาจเข้าใจผิดเส้นทางเหล่านั้นในยามว่างดังนั้นจึงไม่ได้ใช้มากเกินไป แอปพลิเคชันที่ไม่ใช่ CLI ที่ไม่ได้พยายามตรวจสอบเส้นทางของตัวเอง (ใช้งานไม่ได้) ของตัวเองทำงานได้ดีตั้งแต่เริ่มต้น
คุณไม่ควรใช้ทั้งใน C # คุณควรใช้ระดับPath
นี่มีวิธีการที่เรียกPath.Combine
ว่าสามารถใช้ในการสร้างเส้นทางโดยไม่ต้องระบุตัวคั่น
ตัวอย่างการใช้งาน:
string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
\
ใช้สำหรับพา ธ ไฟล์โลคัล Windows และพา ธ เครือข่ายดังเช่นใน:
C:\Windows\Temp\
หรือ \\NetworkSharedDisk\Documents\Archive\
/
เป็นสิ่งที่จำเป็นโดยมาตรฐาน URIs เช่นเดียวกับใน:
/
เส้นทางได้ (อย่างน้อย 7 ตัว)
/
URI ที่เป็นมาตรฐานดังที่ฉันได้ระบุไว้ในคำตอบ