Różnica między ukośnikiem w przód (/) i ukośnikiem odwrotnym (\) w ścieżce pliku

153

Zastanawiałem się nad różnicą między ścieżkami plików \i między nimi /. Zauważyłem, że czasami ścieżka zawiera, /a czasami jest z \.

Byłoby wspaniale, gdyby ktoś mógł wyjaśnić, kiedy używać \i /.

Człowiek Pająk
źródło
4
Różnica w jakim kontekście? Kontekst sieciowy? Ucieczka w ciągach C #? Jest oznaczony tagiem ASP.NET.
Peter Mortensen
6
@Peter Zamknę starszą jako oszustwo, ponieważ ta ma lepsze odpowiedzi.
nicael
6
W jaki sposób C # i asp.net są powiązane z pytaniem?
Oriol
2
@zzzzBov dlaczego ten nie został po prostu przekierowany do starszego i tam zostały umieszczone lepsze odpowiedzi? Nie podoba mi się system, w którym pytanie, które zadaję, mogłoby zostać zamknięte w dalekiej przyszłości jako „duplikat” czegoś, co wydarzyło się później. Przynajmniej nazwij to czymś bardziej opisowym, jak „zastąpione”, a nie powielone. Oryginalna „jedynka” nie może być duplikatem czegokolwiek, jest jedyna.

Odpowiedzi:

248

/jest separatorem ścieżek w systemach uniksowych i uniksopodobnych. Współczesny system Windows może generalnie używać obu ścieżek plików \i /zamiennie, ale firma Microsoft od \dziesięcioleci zalecała używanie jako separatora ścieżek.

Dzieje się tak z powodów historycznych, które sięgają lat 70., wyprzedzając Windows o ponad dekadę. Na początku MS-DOS (podstawa wczesnego Windowsa) nie obsługiwał katalogów. Unix /od początku obsługiwał katalogi przy użyciu znaku. Jednak gdy katalogi zostały dodane w MS-DOS 2.0, Microsoft i IBM używali już /znaku dla przełączników poleceń , a ze względu na lekki parser DOS (pochodzący z QDOS , zaprojektowany do pracy na niższym sprzęcie), nie mogli znaleźć realny sposób używania /postaci bez przerywania kompatybilności z ich istniejącymi aplikacjami.

Aby więc uniknąć błędów związanych z „brakiem przełącznika” lub „nieprawidłowym przełącznikiem” podczas przekazywania ścieżek plików jako argumentów do poleceń, takich jak te:

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

zdecydowano, że \zamiast tego zostanie użyty znak, więc możesz napisać te polecenia w ten sposób

cd\
dir folder1\folder2

bez błędu.

Później Microsoft i IBM współpracowały nad systemem operacyjnym niezwiązanym z DOS o nazwie OS / 2 . OS / 2 miał możliwość używania obu separatorów, prawdopodobnie w celu przyciągnięcia większej liczby programistów Uniksa. Kiedy Microsoft i IBM rozstały się w 1990 roku , Microsoft wziął swój kod i stworzył Windows NT , na którym są oparte wszystkie współczesne wersje Windows, niosąc ze sobą agnostycyzm separatora.


Ponieważ kompatybilność wsteczna była nazwą gry dla Microsoftu ze wszystkich głównych przejść systemu operacyjnego, których podjęli (DOS na Win16 / DOS, na Win16 / Win32, na Win32 / WinNT), ta osobliwość utknęła i prawdopodobnie będzie istnieją jeszcze przez jakiś czas.

Z tego powodu istnieje ta rozbieżność. To naprawdę nie powinno mieć wpływu na to, co robisz, ponieważ, jak powiedziałem, WinAPI może generalnie używać ich zamiennie. Jednak aplikacje innych firm prawdopodobnie zepsują się, jeśli przejdziesz a, /gdy oczekują \między nazwami katalogów. Jeśli używasz systemu Windows, trzymaj się \. Jeśli używasz Uniksa lub URI (które opierają się na ścieżkach uniksowych, ale to zupełnie inna historia), użyj /.


W kontekście C #: Należy zauważyć, ponieważ jest to technicznie kwestia C #, że jeśli chcesz napisać bardziej „przenośny” kod C #, który działa zarówno w systemie Unix, jak i Windows (nawet jeśli C # jest głównie językiem Windows), Path.DirectorySeparatorCharmożesz chcieć użyć tego pola, aby kod używał preferowanego separatora w tym systemie i użyj go Path.Combine()do prawidłowego dołączania ścieżek.

PC Luddite
źródło
57
I zawsze łącz ścieżki za pomocą Path.Combine.
Cheng Chen
1
Ciekawy. Tak więc w systemie DOS lub Windows foo.exe /barmoże być interpretowane jako przełącznik wiersza poleceń, podczas gdy foo.exe \barmoże być interpretowane jako odnoszące się do pliku / folderu o nazwie, barktóry znajduje się w katalogu głównym \bieżącego „dysku”, jak C:\na przykład.
Jeppe Stig Nielsen
4
Należy zauważyć, że ta normalizacja od /do \ jest wykonywana w warstwie kompatybilności Win32, co oznacza, że ​​jeśli ją obejdziesz, będzie różnica. Najbardziej znanym tego przykładem są ścieżki o rozszerzonej długości: \\?\C:\ będą działać zgodnie z oczekiwaniami na NTFS, ale \\?\C:/nie.
Voo,
4
@PC Luddite: To WinAPI może obsłużyć oba /i ` is not entirely true. For network path you have to use `(np. \\ <nazwa_serwera> bot nie // <nazwa_serwera>)
raznagul
2
@raznagul True. W mojej odpowiedzi nie wspomniałem o ścieżkach sieciowych. Utknąłem głównie z popularnym typem ścieżki. Dodam to.
PC Luddite
20

MS-DOS 1.0 zachował konwencję znakową opcji wiersza poleceń (lub przełącznika) z CP / M. W tym czasie nie było struktury katalogów w systemie plików i nie było konfliktu.

Kiedy Microsoft opracował bardziej uniksowe środowisko z MS-DOS (i PC-DOS) 2.0, musiał przedstawić separator ścieżek za pomocą czegoś, co nie koliduje z istniejącymi opcjami wiersza poleceń. Wewnętrznie system działa równie dobrze z „/” lub „\”. Procesor poleceń (i wiele aplikacji) nadal używał znaku „/” jako znaku przełącznika.

CONFIG.SYSWpis SWITCHAR=-mógł zostać użyty do zastąpienia /domyślnego poprawić kompatybilność Unix. To sprawia, że ​​wbudowane polecenia i standardowe narzędzia używają znaku alternatywnego. W ten sposób uniksowy separator ścieżki mógłby być jednoznacznie użyty dla nazw plików i katalogów. Ten wpis został usunięty w późniejszych wersjach, ale udokumentowano wywołanie DOS w celu ustawienia wartości po uruchomieniu.

Było to rzadko używane, a większość narzędzi innych firm pozostała niezmieniona. Zamieszanie trwa. Wiele portów narzędzi uniksowych zachowuje znak przełącznika „-”, podczas gdy niektóre obsługują obie konwencje.

Kolejny procesor poleceń programu PowerShell implementuje rygorystyczne parametry ucieczki i przełączania oraz w znacznym stopniu unika zamieszania, z wyjątkiem sytuacji, gdy używane są starsze narzędzia.

Ani pytanie, ani odpowiedź nie odnoszą się do języka C #.

Pekka
źródło
2
Jako notatka historyczna, użycie /jako opcji wprowadzającej w różnych systemach operacyjnych PDP-11, takich jak RSTS (1970) i ​​RSX (1972), poprzedza to w CP / M (1973).
PJTraill,
9

W systemach uniksowych \jest to znak zmiany znaczenia, czyli \mówi parserowi, że jest to spacja, a nie koniec instrukcji. W systemach Unix /jest to separator katalogów.

W systemie Windows \jest separatorem katalogów, ale /nie można go używać w nazwach plików lub katalogów.

CountryRabbit
źródło
1
\ i /(jak również kilka innych symboli) nie może być użyte w nazwach plików, ponieważ DOS nie miał tego samego złożonego parsera, do którego użytkownicy Uniksa są przyzwyczajeni. Brak dobrego parsera był wynikiem wywodzenia się MS-DOS z QDOS („Szybki i brudny system operacyjny”). Miał sprawić, że wszystko będzie działać szybko i na ograniczonym sprzęcie. Wszystko to oczywiście nadal istnieje w dzisiejszych czasach ze względu na wsteczną kompatybilność.
PC Luddite,
2
cóż, warto wspomnieć, że w późniejszych wersjach systemu Windows /został dodany jako „Alternate_Directory_Separator”
Tomer W
@PCLuddite może zamiast tego powinniśmy pomyśleć o kompatybilności w przód?
1
@nocomprende A co z niekompatybilnymi ścieżkami plików? Niezgodne z czym? I tak jak powiedziałem wcześniej, uratowanie „kilku aplikacji DOS” (a właściwie tysięcy) przed uszkodzeniem było bardzo ważne dla konsumentów w tamtym czasie. To właśnie sprawiło, że Microsoft odniósł dziś sukces, a Unix (i wszyscy inni tak naprawdę) zaczął podupadać (nawet jeśli nastąpił odrodzenie w ostatniej dekadzie). Nie rozumiem, jak to nie patrzy na to ze zdrowym rozsądkiem.
PC Luddite
1
@nocomprende Twój argument dotyczący braku standaryzacji ścieżek plików jest całkowicie nieważny. Są znormalizowane w systemie Windows i są znormalizowane w systemie Unix. Jeśli mówisz o standardzie międzyplatformowym, nie jest to zbyt przydatne ani łatwe do wdrożenia. Kto może powiedzieć, że jeden standard jest naprawdę „lepszy” niż inny?
PC Luddite,
8
  • Adres URL, znormalizowany w RFC 1738, zawsze używa ukośników, niezależnie od platformy.
  • Ścieżka do pliku i identyfikator URI są różne. \jest poprawny w ścieżce pliku systemu Windows i /jest poprawny w identyfikatorze URI.
  • Kilka przeglądarek (mianowicie Firefox i Opera) kończy się niepowodzeniem podczas napotykania identyfikatorów URI z ukośnikami odwrotnymi.
  • System.IO.Path.DirectorySeparatorChar, aby uzyskać bieżący separator ścieżki

Może to być odpowiedni zasób.

Sami
źródło
10
Awaria katastrofalnie? Firefox tłumaczy \​​się /automatycznie na. W mojej książce nazywa się to „działa płynnie”.
Kroltan
22
mój dom stanął w ogniu, kiedy ostatnio korzystałem z \ w przeglądarce Firefox
user3163495
1
@CarstenS, Firefox nie konwertuje ukośnika odwrotnego na ukośnik w adresie URL automatycznie i nie otwiera łącza. Ten dodatek poprawia adres URL za pomocą odwrotnego ukośnika i otwartej strony. addons.mozilla.org/en-US/seamonkey/addon/…
Sami
Co dokładnie masz na myśli mówiąc o „katastrofalnej porażce”? Co się dzieje? Czy przeglądarka ulega awarii i kończy pracę?
Peter Mortensen
7

Oprócz udzielonych odpowiedzi warto wspomnieć, że \jest on szeroko stosowany w przypadku znaków specjalnych (np. \n \t) W językach programowania, edytorach tekstu i ogólnych systemach wykorzystujących analizę leksykalną.

Jeśli na przykład programujesz, czasami niewygodne jest nawet konieczność zmiany znaku ukośnika odwrotnego za pomocą innego znaku ( \\) w celu prawidłowego użycia - lub potrzeba użycia znaków ucieczki, takich jak C # @"\test".

Oczywiście, jak wspomniano wcześniej, sieciowe URI standardowo używają ukośnika ale oba ukośniki działają w najnowszych i najpopularniejszych narzędziach wiersza poleceń.

UPDATE: Po wyszukaniu trochę, wydaje się całą historię pomiędzy /i \wraca w historii „komputer”, w wieku od DOS i systemów uniksowych na w tym czasie. HowToGeek ma ciekawy artykuł o tej historii.

Krótko mówiąc, DOS 1.0 został pierwotnie wydany przez IBM bez obsługi katalogów i /był używany do innej funkcji komend („przełączania”). Kiedy katalogi zostały wprowadzone w wersji 2.0, /były już używane, więc IBM wybrał najbliższy wizualnie symbol, którym był \. Z drugiej strony standardowo używany Unix/ do katalogów.

Gdy użytkownicy zaczęli korzystać z wielu różnych systemów, zaczęli być zdezorientowani, przez co programiści systemu operacyjnego próbowali sprawić, by systemy działały w obu przypadkach - dotyczy to nawet części adresów URL, ponieważ niektóre przeglądarki obsługują http: \\ www.test. com \ go w formacie. Miało to ogólnie wady, ale cała sprawa stoi dziś na przyczynach wstecznej kompatybilności, z próbą obsługi obu ukośników w systemie Windows, mimo że nie są już oparte na DOS.

Nick L.
źródło
„Oba ukośniki działają w ścieżkach systemu plików”. jest niepoprawne, ponieważ Unix jest dość zły, kiedy używasz ` as well as many powłok make` ... masz rację, że ostatni Windows zdefiniował zmienną środowiskową ALTERNATE_PATH_SEPARATOR, która jest domyślna, /dlatego Windows prawdopodobnie może zaakceptować obie.
Tomer W
1
@TomerW Windows NT zawsze był zgodny z POSIX (chociaż wczesny POSIX i tak był bałaganem, a część z nich utknęła w systemie Windows ze względu na kompatybilność wsteczną). Obejmowało to wspieranie /ścieżek w całym systemie - oczywiście aplikacje mogły źle interpretować te ścieżki w czasie wolnym, więc nie były używane zbyt często. Aplikacje inne niż CLI, które nie próbowały wykonać własnej (zepsutej) weryfikacji ścieżek, działały dobrze od samego początku.
Luaan,
@Luaan Windows miał możliwość obsługi wielu funkcji POSIX, ale nie powiedziałbym, że był "zgodny z POSIX". Jasne, było kilka podsystemów POSIX, z których można było korzystać przez lata, ale były one dalekie od ideału. Windows 10 będzie obsługiwał Ubuntu bash, choć jeszcze tego lata, wraz z natywną obsługą narzędzi Linuksa, które są dostarczane z Ubuntu, więc być może będziesz mógł się o to spierać w przyszłości, ale z pewnością nie możesz powiedzieć „zawsze”.
PC Luddite
@Luaan Chyba że przez „kompatybilny” masz na myśli „działa cygwin”.
PC Luddite,
@PCLuddite Nie, był w 100% zgodny z POSIX.1c. To nie znaczy, że wszystkie aplikacje UNIX nad nim pracować - większość aplikacji UNIX są nie POSIX zgodne :)
Luaan
6

Nie powinieneś używać ani w C #. Powinieneś zawsze używać Pathklasy . Zawiera metodę o nazwie, Path.Combinektórej można użyć do tworzenia ścieżek bez samodzielnego określania separatora.

Przykładowe użycie:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
TheLethalCoder
źródło
5

\ jest używany do lokalnych ścieżek plików systemu Windows i ścieżek sieciowych, jak w:

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

/ jest to, czego wymagają standardowe identyfikatory URI, takie jak:

http://www.stackoverflow.com/

Popiół
źródło
2
@NikhilVartak, dodałem przykłady, chociaż myślałem, że moja początkowa odpowiedź dotyczy wszystkich pytań PO.
Ash
3
Windows rozpoznaje również /ścieżki (co najmniej 7).
Kenneth K.
Ta odpowiedź jest daleka od pełnej.
reinierpost
Czy miałeś zamieścić link do niektórych zasobów, poza tylko stroną główną Stack Overflow?
Tas
@reinierpost, moja odpowiedź opiera się na pytaniu OP i powiązanych tagach. Podobnie jak kilka innych odpowiedzi tutaj, mógłbym skopiować coś ze stackoverflow.com/questions/1589930/ ... i wkleić to tutaj, ale wydawało się to przesadne. @tas, zamierzałem zamieścić łącze do strony stackoverflow lub dowolnego hiperłącza do witryny internetowej, aby zilustrować użycie /w standardowych identyfikatorach URI, jak wskazałem w odpowiedzi.
Ash