Perbedaan antara garis miring maju (/) dan garis miring terbalik (\) di jalur file

153

Saya bertanya-tanya tentang perbedaan antara \dan /di jalur file. Saya perhatikan bahwa kadang-kadang jalan berisi /dan kadang-kadang dengan \.

Akan lebih bagus jika ada yang bisa menjelaskan kapan harus menggunakan \dan /.

Manusia laba-laba
sumber
4
Perbedaan dalam konteks apa? Konteks webby? Melarikan diri dalam string C #? Itu ditandai dengan ASP.NET.
Peter Mortensen
9
Kemungkinan duplikat Perbedaan antara forward dan backslash
Peter Mortensen
6
@ Peter Saya akan menutup yang lebih tua sebagai korban penipuan ini, karena ini sudah mendapat jawaban yang lebih baik.
nicael
6
Bagaimana c # dan asp.net terkait dengan pertanyaan?
Oriol
2
@zzzzBov mengapa yang ini tidak hanya diarahkan ke yang lebih lama dan jawaban yang lebih baik ditempatkan di sana? Saya tidak suka sistem di mana pertanyaan yang saya ajukan dapat ditutup di masa depan sebagai "duplikat" dari sesuatu yang terjadi kemudian. Setidaknya menyebutnya sesuatu yang lebih deskriptif, seperti "digantikan" daripada duplikat. "Satu" yang asli tidak dapat menjadi duplikat dari apa pun, itu adalah satu-satunya.

Jawaban:

248

/adalah pemisah jalur pada sistem Unix dan Unix-like. Windows modern umumnya dapat menggunakan keduanya \dan secara /bergantian untuk filepath, tetapi Microsoft telah menganjurkan penggunaannya\ sebagai pemisah jalur selama beberapa dekade.

Hal ini dilakukan karena alasan historis yang berasal dari tahun 1970-an, sebelum Windows lebih dari satu dekade. Pada awalnya, MS-DOS (fondasi untuk Windows awal) tidak mendukung direktori. Unix memiliki dukungan direktori menggunakan /karakter sejak awal. Namun, ketika direktori ditambahkan dalam MS-DOS 2.0, Microsoft dan IBM sudah menggunakan /karakter untuk perintah switch , dan karena parser ringan DOS (diturunkan dari QDOS , dirancang untuk berjalan pada perangkat keras ujung bawah), mereka tidak dapat menemukan cara yang layak untuk menggunakan /karakter tanpa memutus kompatibilitas dengan aplikasi yang ada.

Jadi, untuk menghindari kesalahan tentang "missing a switch" atau "switch tidak valid" saat meneruskan file data sebagai argumen untuk perintah seperti ini:

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

diputuskan bahwa \karakter akan digunakan sebagai gantinya, sehingga Anda dapat menulis perintah-perintah seperti ini

cd\
dir folder1\folder2

tanpa error.

Kemudian, Microsoft dan IBM berkolaborasi pada sistem operasi yang tidak terkait dengan DOS yang disebut OS / 2 . OS / 2 memiliki kemampuan untuk menggunakan kedua pemisah, mungkin untuk menarik lebih banyak pengembang Unix. Ketika Microsoft dan IBM berpisah pada tahun 1990 , Microsoft mengambil kode apa yang mereka miliki dan menciptakan Windows NT , yang menjadi dasar semua versi Windows modern, membawa agnostisisme pemisah ini dengannya.


Karena kompatibilitas ke belakang telah menjadi nama permainan untuk Microsoft dari semua transisi OS utama yang telah mereka lakukan (DOS ke Win16 / DOS, ke Win16 / Win32, ke Win32 / WinNT), kekhasan ini macet, dan mungkin akan ada untuk sementara waktu.

Karena alasan inilah perbedaan ini ada. Seharusnya benar-benar tidak berpengaruh pada apa yang Anda lakukan karena, seperti saya katakan, WinAPI umumnya dapat menggunakannya secara bergantian. Namun, aplikasi pihak ke-3 mungkin akan rusak jika Anda memberikan /ketika mereka mengharapkan \nama direktori. Jika Anda menggunakan Windows, tetap gunakan \. Jika Anda menggunakan Unix atau URI (yang memiliki fondasi di jalur Unix, tapi itu cerita lain sepenuhnya), maka gunakan /.


Dalam konteks C #: Perlu dicatat, karena ini secara teknis adalah pertanyaan C #, bahwa jika Anda ingin menulis lebih banyak kode C "portabel" yang bekerja pada Unix dan Windows (bahkan jika C # sebagian besar adalah bahasa Windows), Anda mungkin ingin menggunakan Path.DirectorySeparatorCharbidang tersebut sehingga kode Anda menggunakan pemisah yang disukai pada sistem itu, dan gunakan Path.Combine()untuk menambahkan jalur dengan benar.

PC Luddite
sumber
57
Dan selalu menggabungkan jalur menggunakan Path.Combine.
Cheng Chen
1
Menarik. Jadi di bawah DOS atau Windows, foo.exe /bardapat ditafsirkan sebagai saklar baris perintah, sementara foo.exe \barmungkin ditafsirkan sebagai merujuk ke file / folder yang disebut baryang terletak di direktori root \dari "drive" saat ini, sepertiC:\ misalnya.
Jeppe Stig Nielsen
4
Perlu dicatat bahwa normalisasi ini dari /ke \ dilakukan di lapisan compat Win32, yang berarti bahwa jika Anda mengelak, akan ada perbedaan. Contoh paling dikenal dari ini adalah jalur panjang diperpanjang: \\?\C:\ akan bekerja seperti yang diharapkan pada NTFS tetapi \\?\C:/tidak akan.
Voo
4
@ PC Luddite: WinAPI itu bisa menangani keduanya /dan` is not entirely true. For network path you have to use `(mis. \\ <servername> bot tidak // <servername>)
raznagul
2
@raznagul Benar. Saya tidak benar-benar menyebutkan jalur jaringan dalam jawaban saya. Saya terjebak terutama dengan tipe filepath yang umum. Saya akan menambahkannya.
PC Luddite
20

MS-DOS 1.0 mempertahankan opsi baris perintah (atau beralih) konvensi karakter '/' dari CP / M. Pada saat itu tidak ada struktur direktori dalam sistem file dan tidak ada konflik.

Ketika Microsoft mengembangkan lingkungan yang lebih mirip Unix dengan MS-DOS (dan PC-DOS) 2.0, mereka harus mewakili pemisah jalur menggunakan sesuatu yang tidak bertentangan dengan opsi baris perintah yang ada. Secara internal, sistem bekerja sama baiknya dengan '/' atau '\'. Prosesor perintah (dan banyak aplikasi) terus menggunakan '/' sebagai karakter sakelar.

Sebuah CONFIG.SYSentri SWITCHAR=-dapat digunakan untuk mengesampingkan /standar untuk meningkatkan kompatibilitas Unix. Ini membuat perintah bawaan dan utilitas standar menggunakan karakter alternatif. Pemisah jalur Unix kemudian dapat digunakan untuk nama file dan direktori. Entri ini telah dihapus di versi yang lebih baru, tetapi panggilan DOS didokumentasikan untuk mengatur nilai setelah boot.

Ini sedikit digunakan dan sebagian besar alat pihak ketiga tetap tidak berubah. Kebingungan masih ada. Banyak port alat Unix mempertahankan karakter '-' switch sementara beberapa mendukung kedua konvensi.

Prosesor perintah PowerShell tindak lanjut mengimplementasikan parameter pelolosan dan sakelar yang ketat dan sebagian besar menghindari kebingungan kecuali di mana alat lawas digunakan.

Baik pertanyaan maupun jawabannya tidak berhubungan dengan C #.

Pekka
sumber
2
Sebagai catatan sejarah, penggunaan /sebagai pengantar opsi dalam berbagai sistem operasi PDP-11 seperti RSTS (1970) dan RSX (1972) mendahului dalam CP / M (1973).
PJTraill
9

Pada sistem berbasis Unix \adalah karakter pelarian, yaitu, \memberitahu parser bahwa ini adalah ruang dan bukan akhir dari pernyataan. Pada sistem Unix /adalah pemisah direktori.

Pada Windows \adalah pemisah direktori, tetapi /tidak dapat digunakan dalam nama file atau direktori.

CountryRabbit
sumber
1
\ dan /(juga beberapa simbol lainnya) tidak dapat digunakan dalam nama file karena DOS tidak memiliki parser kompleks yang sama dengan yang digunakan oleh para pengguna Unix. Kurangnya pengurai yang baik adalah hasil dari MS-DOS yang diturunkan dari QDOS ("Sistem Operasi Cepat dan Kotor"). Itu dimaksudkan untuk membuat semuanya berjalan cepat dan pada perangkat keras yang terbatas. Semua ini tentu saja masih ada sampai sekarang untuk kompatibilitas.
PC Luddite
2
baik, layak disebutkan bahwa dalam versi Windows kemudian /ditambahkan sebagai "Alternate_Directory_Separator"
Tomer W
@ PCLuddite mungkin kita harus memikirkan kompatibilitas ke depan?
1
@nocomprende Bagaimana dengan filepath yang tidak dapat dilewati? Tak tertandingi dengan apa? Dan seperti yang saya katakan sebelumnya, menyelamatkan "beberapa aplikasi DOS" (yang sebenarnya lebih seperti ribuan) dari kerusakan sangat penting bagi konsumen pada saat itu. Itulah yang membuat Microsoft sukses hari ini dan Unix (dan yang lainnya benar-benar) mulai menurun (bahkan jika ada kebangkitan dalam dekade terakhir). Saya gagal melihat bagaimana itu tidak melihatnya dengan akal sehat.
PC Luddite
1
@nocomprende Dan argumen Anda tentang filepath yang tidak distandarisasi sepenuhnya batal. Mereka dibakukan pada Windows, dan mereka dibakukan pada Unix. Jika Anda berbicara tentang standar lintas platform, itu tidak terlalu berguna atau mudah diimplementasikan. Siapa yang mengatakan bahwa satu standar benar-benar "lebih baik" daripada yang lain?
PC Luddite
8
  • URL, yang distandarisasi dalam RFC 1738, selalu menggunakan garis miring, terlepas dari platform.
  • Jalur file dan URI berbeda. \benar di jalur file Windows dan /benar dalam URI.
  • Beberapa browser (yaitu, Firefox & Opera) gagal serempak ketika bertemu URI dengan backslash.
  • System.IO.Path.DirectorySeparatorChar untuk mendapatkan pemisah jalur saat ini

Ini bisa menjadi sumber yang relevan.

Sami
sumber
10
Gagal serempak? Firefox diterjemahkan \​​ke /otomatis. Dalam buku saya ini disebut "bekerja dengan mulus".
Kroltan
22
rumah saya terbakar saat terakhir saya menggunakan \ di Firefox
user3163495
1
@CarstenS, Firefox tidak mengonversi backslash untuk meneruskan slash di URL secara otomatis dan tidak membuka tautan. Add-on ini mengoreksi URL dengan backslash dan halaman terbuka. addons.mozilla.org/en-US/seamonkey/addon/…
Sami
Apa sebenarnya yang Anda maksud dengan "gagal serempak"? Apa yang terjadi? Apakah browser macet dan keluar?
Peter Mortensen
7

Terlepas dari jawaban yang diberikan, perlu disebutkan bahwa \banyak digunakan untuk karakter khusus (seperti\n \t ) dalam bahasa pemrograman, editor teks dan sistem umum yang menerapkan analisis leksikal.

Jika Anda pemrograman misalnya, kadang-kadang tidak nyaman bahkan perlu melarikan diri backslash dengan yang lain ( \\) untuk menggunakannya dengan benar - atau perlu menggunakan string yang lolos, seperti C # @"\test".

Tentu saja, seperti yang disebutkan sebelumnya, web URI menggunakan garis miring dengan standar tetapi kedua garis miring bekerja di alat baris perintah terbaru dan paling umum.

UPDATE: Setelah mencari sedikit, tampaknya seluruh cerita antara /dan \kembali ke "sejarah komputer", di zaman DOS dan sistem berbasis Unix pada waktu itu. HowToGeek memiliki artikel yang menarik tentang kisah ini.

Dalam jangka pendek, DOS 1.0 pada awalnya dirilis oleh IBM tanpa dukungan direktori, dan /digunakan untuk fungsionalitas perintah lain ("switching"). Ketika direktori diperkenalkan dalam versi 2.0, /sudah digunakan, jadi IBM memilih simbol yang paling dekat secara visual \. Di sisi lain, Unix secara standar digunakan /untuk direktori.

Ketika pengguna mulai menggunakan banyak sistem yang berbeda, mereka mulai menjadi bingung, membuat pengembang OS berusaha membuat sistem bekerja dalam kedua kasus - ini bahkan berlaku di bagian URL, karena beberapa browser mendukung http: \\ www.test. Format com \ go . Ini memiliki kelemahan meskipun secara umum, tetapi semuanya berdiri hari ini masih untuk penyebab kompartibilitas mundur, dengan upaya untuk mendukung kedua garis miring pada Windows, meskipun mereka tidak berdasarkan DOS lagi.

Nick L.
sumber
"Kedua garis miring bekerja di jalur sistem file." salah, karena Unix sangat marah ketika Anda menggunakan ` as well as many make` shells ... Anda benar bahwa Windows baru-baru ini telah mendefinisikan variabel lingkungan ALTERNATE_PATH_SEPARATOR yang default untuknya /maka Windows mungkin dapat menerima keduanya.
Tomer W
1
@TomerW Windows NT selalu kompatibel dengan POSIX (meskipun POSIX awal masih berantakan, dan beberapa di antaranya macet di Windows untuk kompatibilitas mundur). Itu termasuk /jalur pendukung di mana saja dalam sistem - tentu saja, aplikasi bisa salah paham jalur itu di waktu luang mereka, jadi itu tidak digunakan terlalu banyak. Aplikasi non-CLI yang tidak mencoba melakukan validasi jalurnya sendiri (rusak) bekerja dengan baik sejak awal.
Luaan
@Luaan Windows memiliki kemampuan untuk mendukung banyak fitur POSIX, tetapi saya tidak akan mengatakan itu "POSIX-compatible". Tentu, ada beberapa subsistem POSIX yang bisa digunakan selama bertahun-tahun, tetapi masih jauh dari ideal. Windows 10 akan mendukung bash Ubuntu meskipun akhir musim panas ini bersama dengan dukungan asli untuk alat-alat Linux yang datang dengan Ubuntu, jadi Anda mungkin dapat berdebat bahwa di masa depan, tetapi Anda tentu tidak bisa mengatakan "selalu".
PC Luddite
@Luaan Kecuali jika "kompatibel", maksud Anda "cygwin works".
PC Luddite
@ PCLuddite Tidak, itu 100% POSIX.1c kompatibel. Itu tidak berarti bahwa semua aplikasi unix bekerja di dalamnya - sebagian besar aplikasi unix tidak sesuai dengan POSIX :)
Luaan
6

Anda seharusnya tidak menggunakan salah satu di C #. Anda harus selalu menggunakan Pathkelas . Ini berisi metode yang disebut Path.Combineyang dapat digunakan untuk membuat jalur tanpa menentukan pemisah sendiri.

Contoh penggunaan:

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

\ digunakan untuk jalur file lokal Windows dan jalur jaringan seperti pada:

C:\Windows\Temp\ atau \\NetworkSharedDisk\Documents\Archive\

/ adalah apa yang diperlukan oleh URI standar seperti pada:

http://www.stackoverflow.com/

Abu
sumber
2
@NikhilVartak, saya telah menambahkan contoh meskipun saya pikir jawaban awal saya membahas semua pertanyaan OP.
Ash
3
Windows juga mengenali /jalur (setidaknya 7).
Kenneth K.
Jawaban ini jauh dari lengkap.
reinierpost
Apakah Anda bermaksud menautkan ke beberapa sumber daya, selain hanya halaman utama Stack Overflow?
Tas
@reinierpost, jawaban saya didasarkan pada pertanyaan OP dan tag terkait. Seperti beberapa jawaban lain di sini, saya dapat menyalin sesuatu dari stackoverflow.com/questions/1589930/… dan menempelkannya di sini tetapi sepertinya berlebihan. @tas, saya bermaksud untuk menautkan ke halaman stackoverflow atau hyperlink situs web apa pun untuk mengilustrasikan penggunaan /dalam standarad URI seperti yang telah saya sebutkan dalam jawaban.
Ash