Dosya yolundaki eğik çizgi (/) ve ters eğik çizgi (\) arasındaki fark


153

Ben arasındaki fark hakkında merak \ve /dosya yollarındaki. Bazen bir yolun, /bazen de onunla birlikte olduğunu fark ettim \.

Herkes ne zaman kullanılacağını açıklayabilirse harika olur \ve /.


4
Hangi bağlamda fark var? Webby bağlamı? C # dizeleri kaçan? ASP.NET ile etiketlenir.
Peter Mortensen


6
@Peter Daha iyi cevapları olduğu için eskisini bunun dupu olarak kapatırdım.
nicael

6
Nasılsınız c # ve asp.net soruya ilişkin?
Oriol

2
@zzzzBov neden bu sadece eskisine yönlendirilmiyordu ve o kadar iyi yanıtlar veriliyordu? Sorduğum bir sorunun daha sonra gerçekleşen bir şeyin "kopyası" olarak uzak gelecekte kapatılabileceği bir sistemi sevmiyorum. En azından çoğaltmak yerine "yerini almış" gibi daha açıklayıcı bir şey olarak adlandırın. Orijinal "bir" hiçbir şeyin kopyası olamaz, tek olanıdır.

Yanıtlar:


248

/Unix ve Unix benzeri sistemlerde yol ayırıcıdır. Modern Windows dosya yollarında genellikle her ikisini de \ve /birbirinin yerine kullanabilir , ancak Microsoft \onlarca yıldır yol ayırıcı olarak kullanılmasını savunmuştur .

Bu, 1970'lere kadar uzanan tarihsel nedenlerden ötürü, Windows'un on yıldan fazla bir süre öncesine dayanmasıyla yapılır. Başlangıçta, MS-DOS (erken Windows için temel) dizinleri desteklemiyordu. Unix, /en başından beri karakteri kullanarak dizin desteğine sahipti . Ancak, MS-DOS 2.0 dizinleri eklendiğinde, Microsoft ve IBM zaten komut anahtarları için /karakterini kullanıyordu ve DOS'un hafif ayrıştırıcısı ( alt uç donanımda çalışmak üzere tasarlanmış QDOS'dan alınıyor ) nedeniyle, bir karakteri mevcut uygulamalarıyla uyumluluğu bozmadan kullanmanın uygun bir yolu ./

Bu nedenle, dosya yollarını aşağıdaki gibi komutlara argüman olarak iletirken "bir anahtarı kaçırmak" veya "geçersiz anahtarı" ile ilgili hataları önlemek için:

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

\karakterin kullanılmasına karar verildi , böylece bu komutları şöyle yazabilirsiniz

cd\
dir folder1\folder2

hatasız.

Daha sonra Microsoft ve IBM, DOS ile ilgisi olmayan OS / 2 adlı bir işletim sisteminde işbirliği yaptı . OS / 2, muhtemelen daha fazla Unix geliştiricisini çekmek için her iki ayırıcıyı da kullanma yeteneğine sahipti. Ne zaman , Microsoft ve IBM 1990 yılında yollarını ayırdı Microsoft ne vardı kod aldı ve oluşturulan Windows NT Windows'un tüm modern versiyonları onunla bu ayırıcı bilinemezciliği taşıyan dayandırıldığı.


Geriye dönük uyumluluk, üstlendikleri tüm büyük işletim sistemi geçişlerinden (DOS'tan Win16 / DOS'a, Win16 / Win32'ye, Win32 / WinNT'ye) Microsoft için oyunun adı olduğundan, bu özellik sıkışmış ve muhtemelen bir süredir var.

Bu nedenle bu tutarsızlık var. Yaptığınız şey üzerinde gerçekten bir etkisi olmamalı, çünkü dediğim gibi WinAPI bunları genellikle birbirinin yerine kullanabilir. Ancak, dizin adları arasında /bir süre beklediklerinde bir iletiyi geçerseniz, üçüncü taraf uygulamaları muhtemelen bozulur \. Windows kullanıyorsanız, ile devam edin \. Unix veya URI'ler (temelleri Unix yollarında olan, ancak bu tamamen başka bir hikaye) kullanıyorsanız,/ .


C # bağlamında: Bu, çünkü unutulmamalıdır olduğunu , teknik olarak bir C # soru olduğunu daha "taşınabilir" C # kodu yazmak isterseniz o Unix ve Windows (C # bir Windows dil ağırlıklı olsa bile) hem eserler sizi kullanmak isteyebilirsiniz Path.DirectorySeparatorCharkodunuzu tercih o sistem üzerinde ayırıcı ve kullanımını kullanır böylece alanını Path.Combine()düzgün ekleme yollara.


57
Ve her zaman kullanarak yolları birleştirin Path.Combine.
Cheng Chen

1
İlginç. DOS veya Windows altında, foo.exe /barkomut satırı anahtarı foo.exe \barolarak yorumlanırken , örneğin geçerli "sürücünün" barkök dizininde bulunan adlı bir dosyaya / klasöre atıfta bulunularak yorumlanabilir . \C:\
Jeppe Stig Nielsen

4
O bu normalleşme unutulmamalıdır /için \ bunu atlatmak bile, bir fark olacaktır, yani katmanda compat Win32 yapılır. Bunun en iyi bilinen örneği genişletilmiş uzunluk yollarıdır: \\?\C:\ NTFS'de beklendiği gibi çalışır ancak \\?\C:/çalışmaz.
Voo

4
@PC Luddit: WinAPI hem işleyebilir O /ve ` is not entirely true. For network path you have to use `(örn \\ <servername> bot değil // <servername>.)
raznagul

2
@raznagul Doğru. Cevabımda ağ yollarından gerçekten bahsetmedim. Ben esas olarak ortak dosyayolu türü ile sıkışmış. Bunu ekleyeceğim.
PC Luddite

20

MS-DOS 1.0 '/' komut satırı seçeneği (veya anahtar) karakter kuralını CP / M korudu. O zaman dosya sisteminde dizin yapısı ve çakışma yoktu.

Microsoft, MS-DOS (ve PC-DOS) 2.0 ile daha Unix benzeri bir ortam geliştirdiğinde, varolan komut satırı seçenekleriyle çakışmayan bir şey kullanarak yol ayırıcıyı temsil etmeleri gerekiyordu. Dahili olarak, sistem '/' veya '\' ile eşit derecede iyi çalışır. Komut işlemcisi (ve birçok uygulama) anahtar karakteri olarak '/' karakterini kullanmaya devam etti.

Unix uyumluluğunu iyileştirmek için varsayılanı geçersiz kılmak için bir CONFIG.SYSgirdi SWITCHAR=-kullanılabilir /. Bu, yerleşik komutların ve standart yardımcı programların alternatif karakteri kullanmasını sağlar. Unix yol ayırıcı, dosya ve dizin adları için açık bir şekilde kullanılabilir. Bu girdi sonraki sürümlerde kaldırıldı, ancak önyüklemeden sonra değeri ayarlamak için bir DOS çağrısı belgelendi.

Bu çok az kullanıldı ve üçüncü taraf araçların çoğu değişmedi. Karışıklık devam ediyor. Unix araçlarının çoğu bağlantı noktası '-' anahtar karakterini korurken, bazıları her iki kuralı da destekler.

Takip eden PowerShell komut işlemcisi, zorlu kaçış ve anahtar parametrelerini uygular ve eski araçların kullanıldığı yerler hariç karışıklığı büyük ölçüde önler.

Ne soru ne de cevap C # ile ilgilidir.


2
Tarihsel bir not olarak, /RSTS (1970) ve RSX (1972) gibi çeşitli PDP-11 işletim sistemlerinde seçenek tanıtıcı olarak kullanılması CP / M (1973) 'den önce gelir.
PJTraill

9

Unix tabanlı sistemlerde \bir kaçış karakteri, yani \ayrıştırıcıya bunun ifadenin sonu değil bir boşluk olduğunu söyler. Unix sistemlerinde /dizin ayırıcıdır.

Windows'ta \dizin ayırıcıdır, ancak /dosya veya dizin adlarında kullanılamaz.


1
\ ve /( ve diğer birkaç sembol) dosya adlarında kullanılamaz çünkü DOS, Unix kullanıcılarının alışkın olduğu karmaşık ayrıştırıcıya sahip değildi. İyi bir ayrıştırıcı olmaması, MS-DOS'un QDOS'dan ("Hızlı ve Kirli İşletim Sistemi") alçalmasının sonucudur. İşlerin hızlı ve sınırlı bir donanımda çalışmasını sağlamaktı. Bütün bunlar elbette geriye dönük uyumluluk için günümüzde hala mevcuttur.
PC Luddite

2
iyi, daha sonraki Windows sürümlerinde /bir "Alternate_Directory_Separator" olarak eklendiğini belirtmek gerekir
Tomer W

@PCLuddite belki de bunun yerine ileri uyumluluğu düşünmeliyiz?

1
@nocomprende Dosya yollarının uyumsuz olması ne durumda? Ne ile uyumsuz? Daha önce de söylediğim gibi, "birkaç DOS uygulaması" nın (gerçekten binlerce gibi) kırılmasından o zaman tüketiciler için gerçekten önemliydi. Microsoft'u bugün başarılı kılan şey budur ve Unix (ve diğerlerinin hepsi) düşüşe başlar (son on yılda yeniden diriliş olsa bile). Bunun sağduyuya nasıl bakmadığını göremiyorum.
PC Luddite

1
@nocomprende Standartlaştırılmamış dosyayolları hakkındaki argümanınız tamamen geçersizdir. Windows'da standartlaştırılmıştır ve Unix'te standartlaştırılmıştır. Bir platformlar arası standarttan bahsediyorsanız, bu gerçekten o kadar kullanışlı veya uygulanması kolay değildir. Kim bir standardın diğerinden gerçekten "daha iyi" olduğunu söyleyebilir?
PC Luddite

8
  • RFC 1738'de standartlaştırılmış bir URL, platformdan bağımsız olarak her zaman ileri eğik çizgiler kullanır.
  • Bir dosya yolu ve bir URI farklıdır. \bir Windows dosya yolunda ve /bir URI'de doğrudur.
  • Birçok tarayıcı (yani Firefox ve Opera) ters eğik çizgilerle URI'lerle karşılaştığında felaketle başarısız oluyor.
  • Geçerli yol ayırıcısını almak için System.IO.Path.DirectorySeparatorChar

Bu ilgili bir kaynak olabilir.


10
Felaketle başarısız mı? Firefox çevirir \​​için /otomatik. Kitabımda buna "sorunsuz çalışıyor" deniyor.
Kroltan

22
Firefox'ta \ 'ı en son kullandığımda
evim alev aldı

1
@CarstenS, Firefox URL'de otomatik olarak ters eğik çizgiyi eğik çizgiye dönüştürmez ve bağlantıyı açmaz. Bu eklenti URL'yi ters eğik çizgi ve açık sayfayla düzeltir. addons.mozilla.org/tr-TR/seamonkey/addon/…
Sami

"Felaket başarısızlığı" ile tam olarak ne demek istiyorsun? Ne oluyor? Tarayıcı çöküp çıkıyor mu?
Peter Mortensen

7

Verilen cevapların yanı sıra, programlama dillerinde, metin editörlerinde ve sözcüksel analiz uygulayan genel sistemlerde \(örneğin \n \t) özel karakterler için yaygın olarak kullanılanlardan bahsetmeye değer .

Örneğin, programlıyorsanız, ters eğik çizgiden başka biriyle kaçmak zorunda kalmanız bazen zor olabilir (\\ düzgün bir şekilde kullanmak için ) C # gibi kaçan dizeleri kullanmanız gerekebilir.@"\test" .

Elbette, daha önce de belirtildiği gibi, web URI'leri standart olarak eğik çizgi kullanır ancak her iki eğik çizgi de en son ve en yaygın komut satırı araçlarında çalışır.

GÜNCELLEME: Biraz arama yaptıktan sonra, o zamanlar DOS ve Unix tabanlı sistemler çağında, "bilgisayar geçmişi" arasındaki hikayenin tamamı görünüyor /ve \geri dönüyor. HowToGeek'in bu hikaye hakkında ilginç bir makalesi var.

Kısaca, DOS 1.0 başlangıçta IBM tarafından dizin desteği olmadan yayımlandı ve /başka ("anahtarlama") komut işlevleri için kullanıldı. Dizinler 2.0 sürümünde tanıtıldığında /, zaten kullanımdaydı, bu yüzden IBM görsel olarak en yakın sembolü seçti \. Öte yandan, Unix standart /olarak dizinler için kullanılır .

Kullanıcılar birçok farklı sistemi kullanmaya başladığında, sistem geliştiricilerinin sistemleri her iki durumda da çalıştırmayı denemelerini sağlayarak karışık hale gelmeye başladılar - bazı tarayıcılar http: \\ www.test'i desteklediğinden, bu URL'ler için bile geçerlidir . com \ go biçiminde. Bu genel olarak dezavantajlara sahipti, ancak bugün her şey, artık DOS'a dayanmasalar bile, Windows'ta her iki eğik çizgiyi destekleme girişimi ile hala geriye doğru bölünebilirlik nedenleri için duruyor.


"her iki eğik çizgi dosya sistemi yollarında çalışır." yanlıştır, çünkü ` as well as many makeix kabuklarını kullandığınızda Unix oldukça öfkeli ... son Windows Windows'un varsayılan olarak /her ikisini de kabul edebileceği ALTERNATE_PATH_SEPARATOR ortam değişkenini tanımladığı konusunda haklısınız .
Tomer W

1
@TomerW Windows NT her zaman POSIX uyumlu olmuştur (erken POSIX yine de bir karışıklıktı ve bazıları geriye dönük uyumluluk için Windows'ta sıkışmıştı). Bu /, sistemin her yerinde destek yollarını içeriyordu - elbette, uygulamalar boş zamanlarında bu yolları yanlış anlayabilir, bu yüzden çok fazla kullanılmadı. Kendi yollarını (kırık) doğrulamasını yapmaya çalışmayan CLI dışı uygulamalar, başlangıçtan itibaren iyi çalıştı.
Luaan

@Luaan Windows birçok POSIX özelliğini destekleme yeteneğine sahipti, ancak "POSIX uyumlu" olduğunu söyleyemem. Elbette, yıllar boyunca kullanabileceğiniz birkaç POSIX alt sistemi vardı, ancak bunlar ideal olmaktan uzaktı. Windows 10, Ubuntu ile birlikte gelen Linux araçları için yerel destekle birlikte bu yaz Ubuntu bash'ı destekleyecek, bu nedenle gelecekte bunu iddia edebilirsiniz, ancak kesinlikle "her zaman" diyemezsiniz.
PC Luddite

@Luaan "Uyumlu" ile "cygwin çalışır" demek istemediğiniz sürece.
PC Luddite

@PCLuddite Hayır,% 100 POSIX.1c uyumluydu. Bu, tüm unix uygulamalarının üzerinde çalıştığı anlamına gelmez - çoğu unix uygulaması POSIX uyumlu değildir :)
Luaan

6

Her ikisini de C # ile kullanmamalısınız. Her zaman Pathsınıfı kullanmalısınız . Bu Path.Combine, ayırıcıyı kendiniz belirtmeden yol oluşturmak için kullanılabilecek bir yöntem içerir .

Örnek kullanım:

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

5

\ aşağıdaki gibi Windows yerel dosya yolları ve ağ yolları için kullanılır:

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

/ aşağıdaki gibi standart URI'ler için gereklidir:

http://www.stackoverflow.com/


2
@NikhilVartak, ilk cevabımın OP'nin tüm sorularını ele aldığını düşünmeme rağmen örnekler ekledim.
Ash,

3
Windows /yolları da tanır (en az 7 tanedir).
Kenneth K.

Bu cevap tam olmaktan uzak.
reinierpost

Yalnızca Yığın Taşması ana sayfasının yanı sıra bazı kaynaklara mı bağlanmak istediniz?
Tas

@reinierpost, cevabım OP'nin sorusuna ve ilgili etiketlere dayanıyor. Buradaki diğer cevaplardan birkaçı gibi, stackoverflow.com/questions/1589930/… ' dan bir şey kopyalayabilir ve buraya yapıştırabilirim ama aşırı görünüyordu. @tas, /yanıtta belirttiğim gibi standarad URI'lerde kullanımını göstermek için stackoverflow sayfasına veya herhangi bir web sitesi köprüsüne bağlamayı amaçladım.
Ash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.