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 /
.
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 /
.
Odpowiedzi:
/
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.DirectorySeparatorChar
moż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.
Path.Combine
.
foo.exe /bar
może być interpretowane jako przełącznik wiersza poleceń, podczas gdy foo.exe \bar
może być interpretowane jako odnoszące się do pliku / folderu o nazwie, bar
który znajduje się w katalogu głównym \
bieżącego „dysku”, jak C:\
na przykład.
/
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.
/
i ` is not entirely true. For network path you have to use
`(np. \\ <nazwa_serwera> bot nie // <nazwa_serwera>)
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.SYS
Wpis 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 #.
/
jako opcji wprowadzającej w różnych systemach operacyjnych PDP-11, takich jak RSTS (1970) i RSX (1972), poprzedza to w CP / M (1973).
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.
\
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ść.
/
został dodany jako „Alternate_Directory_Separator”
\
jest poprawny w ścieżce pliku systemu Windows i /
jest poprawny w identyfikatorze URI.Może to być odpowiedni zasób.
\
się /
automatycznie na. W mojej książce nazywa się to „działa płynnie”.
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.
` 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.
/
ś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.
Nie powinieneś używać ani w C #. Powinieneś zawsze używać Path
klasy . Zawiera metodę o nazwie, Path.Combine
któ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");
\
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:
/
ścieżki (co najmniej 7).
/
w standardowych identyfikatorach URI, jak wskazałem w odpowiedzi.