Різниця між косою косою наперед (/) та косою косою рисою (\) у шляху файлу


153

Мені було цікаво про різницю між шляхами до файлів \та /в них. Я помітив, що іноді шлях містить, /а іноді - це \.

Було б чудово, якщо хтось може пояснити, коли користуватися \та /.


4
Різниця в якому контексті? Контекст веб-сайту? Втеча з рядків C #? Він позначений тегом ASP.NET.
Пітер Мортенсен


6
@Peter Я закрив би старішу як справжню справу, оскільки це отримало кращі відповіді.
nicael

6
Як c # і asp.net пов'язані з питанням?
Оріол

2
@zzzzBov, чому це не просто було перенаправлено на старіший і на нього було розміщено кращі відповіді? Мені не подобається система, коли питання, яке я задаю, може бути закритим у далекому майбутньому як "дублікат" чогось, що сталося згодом. Принаймні, назвіть це чимось більш описовим, як-от "заміщене", а не копіювання. Оригінальний "один" не може бути дублікатом нічого, це єдиний.

Відповіді:


248

/є роздільником шляху для Unix та Unix-подібних систем. Сучасні Windows, як правило, можуть використовувати як \і /взаємозамінно для файлових шляхів, але Microsoft \протягом десятиліть виступає за використання як роздільника шляху.

Це робиться з історичних причин, які сягають 1970-х років, передуючи Windows на понад десятиліття. На початку MS-DOS (фундамент для початку Windows) не підтримував каталоги. У Unix була підтримка каталогу, що використовує цей /символ з самого початку. Однак, коли в MS-DOS 2.0 були додані каталоги, Microsoft і IBM вже використовували /символ для перемикань команд , і через легкий аналізатор DOS (походить від QDOS , призначений для роботи на нижньому кінці обладнання) вони не змогли знайти можливий спосіб використання /символу, не порушуючи сумісності з існуючими програмами.

Отже, щоб уникнути помилок про "відсутність перемикача" або "недійсний комутатор" при передачі файлових шляхів як аргументів таким командам:

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

було вирішено, що \замість цього символу буде використано символ, щоб ви могли написати такі команди, як ця

cd\
dir folder1\folder2

без помилок.

Пізніше Microsoft та IBM співпрацювали в операційній системі, не пов'язаній з DOS, під назвою OS / 2 . OS / 2 мав можливість використовувати обидва роздільника, ймовірно, щоб залучити більше розробників Unix. Коли в 1990 році Microsoft і IBM розійшлися , Microsoft взяла код, який вони мали, і створила Windows NT , на якому базуються всі сучасні версії Windows, несучи з собою цей сепараторний агностицизм.


Оскільки зворотна сумісність назвала гру для Майкрософт від усіх основних переходів ОС, які вони здійснили (DOS до Win16 / DOS, Win16 / Win32, Win32 / WinNT), ця особливість залишилася, і це, ймовірно, існує деякий час ще.

Саме з цієї причини існує така невідповідність. Це дійсно не повинно впливати на те, що ви робите, тому що, як я вже сказав, WinAPI може, як правило, використовувати їх взаємозамінно. Однак програми сторонніх розробників, ймовірно, зламаються, якщо ви перейдете, /коли вони очікують \між іменами каталогу. Якщо ви використовуєте Windows, дотримуйтесь \. Якщо ви використовуєте Unix або URI (які мають свою основу в контурах Unix, але цілком інша історія), тоді використовуйте /.


В контексті C #: Слід зазначити, так як це є технічно C # питання, що якщо ви хочете написати більш «портативний» код C # , який працює як на Unix і Windows (навіть якщо C # є головною мовою Windows), вам можливо, захочете використовувати Path.DirectorySeparatorCharполе, щоб ваш код використовував бажаний роздільник у цій системі та використовував Path.Combine()для належного додавання шляхів.


57
І завжди поєднуйте шляхи, використовуючи Path.Combine.
Чен Чен

1
Цікаво. Так, у DOS або Windows foo.exe /barможе трактуватися як перемикач командного рядка, тоді як foo.exe \barможе бути інтерпретований як посилання на файл / папку, що називається, barщо знаходиться в кореневому каталозі \поточного "диска", як, C:\наприклад,.
Джеппе Стіг Нільсен

4
Слід зауважити, що ця нормалізація від /до \ робиться в шарі компаута Win32, тобто, якщо обійти його, буде різниця. Найвідоміший приклад цього - шляхи збільшеної довжини: \\?\C:\ вони працюватимуть, як очікувалося, на NTFS, але \\?\C:/не будуть.
Ву

4
@PC Luddite: що WinAPI може обробляти /і ` is not entirely true. For network path you have to use ", і` (напр. \\ <ім'я сервера> бот не // <ім'я сервера>)
raznagul

2
@raznagul Правда. У своїй відповіді я не дуже згадував мережеві шляхи. Я тримався в основному за типовим файловим шляхом. Я додам це.
ПК Luddite

20

MS-DOS 1.0 зберігає параметр (або перемикання) командного рядка символів '/' від CP / M. На той час у файловій системі не було структури каталогів і не було конфлікту.

Коли Microsoft розробила більше подібне середовище Unix з MS-DOS (і PC-DOS) 2.0, їм потрібно було представити роздільник шляху, використовуючи те, що не суперечило існуючим параметрам командного рядка. Внутрішня система однаково добре працює або з "/", або з \ \. Командний процесор (і багато програм) продовжував використовувати символ "/" як символ комутації.

CONFIG.SYSЗапис SWITCHAR=-може бути використана для перевизначення по /замовчуванням для уможливлення більшої сумісності Unix. Це змушує вбудовані команди та стандартні утиліти використовувати альтернативний символ. Потім роздільник шляхів Unix можна однозначно використовувати для імен файлів та каталогів. Цей запис було видалено в більш пізніх версіях, але було задокументовано дзвінок DOS для встановлення значення після завантаження.

Це мало використовувалося, і більшість сторонніх інструментів залишалися незмінними. Плутанина зберігається. Багато портів інструментів Unix зберігають символ перемикання "-", хоча деякі підтримують обидві конвенції.

Наступний командний процесор PowerShell реалізує суворі параметри виходу та перемикання і значною мірою уникає плутанини, за винятком випадків, коли використовуються застарілі інструменти.

Ні питання, ні відповідь не стосуються C #.


2
Як історична примітка, використання /в якості опціонера в різних операційних системах PDP-11, таких як RSTS (1970) і RSX (1972), передує використанню в CP / M (1973).
PJTraill

9

У системах на базі Unix \- це символ втечі, тобто \говорить аналізатору, що це пробіл, а не кінець оператора. У системах Unix /є роздільник каталогів.

У Windows \- це роздільник каталогів, але його /не можна використовувати в іменах файлів чи директорій.


1
\ і /(як і кілька інших символів) не можна використовувати в іменах, оскільки DOS не мав такого ж складного аналізатора, до якого користувачі Unix так звикли. Відсутність хорошого аналізатора стала результатом того, що MS-DOS походить з QDOS ("Швидка та брудна операційна система"). Він мав на меті швидше працювати з обмеженим обладнанням. Все це, звичайно, існує і в наш час для відсталої сумісності.
ПК Luddite

2
ну, варто згадати, що в пізніших версіях Windows цей /доданий як "Alternate_Directory_Separator"
Tomer W

@PCLuddite, можливо, нам слід думати про сумісність вперед?

1
@nocomprende Що з файловими шляхами є незрівнянним? Незрівнянне з чим? І як я вже говорив раніше, врятувати "кілька додатків DOS" (що насправді більше схоже на тисячі) від зламу було дуже важливим для споживачів того часу. Саме це зробило Microsoft сьогодні успішним, а Unix (і всі інші насправді) починають занепад (навіть якщо в останнє десятиліття відбулося відродження). Я не бачу, як це не дивитися на це здоровим глуздом.
ПК Luddite

1
@nocomprende І ваш аргумент щодо того, що файлові шляхи не стандартизовані, є абсолютно недійсним. Вони стандартизовані в Windows, і вони стандартизовані в Unix. Якщо ви говорите про міжплатформенний стандарт, це насправді не так корисно або просто втілити. Хто скаже, що один стандарт насправді "кращий", ніж інший?
ПК Luddite

8
  • URL-адреса, стандартизована в RFC 1738, завжди використовує косої риски вперед, незалежно від платформи.
  • Шлях до файлу та URI різні. \є правильним у шляху до файлу Windows та /правильним у URI.
  • Декілька браузерів (а саме Firefox & Opera) катастрофічно виходять з ладу при зустрічі URI із зворотним нахилом.
  • System.IO.Path.DirectorySeparatorChar, щоб отримати поточний роздільник шляху

Це може бути відповідний ресурс.


10
Невдача катастрофічно? Firefox перекладається \​​на/ автоматичному режимі. У моїй книзі це називається "працює безшовно".
Кролтан

22
мій будинок загорівся востаннє, коли я користувався \ у Firefox
користувач3163495

1
@CarstenS, Firefox не перетворює зворотну косу рису в пряму косу рису в URL-адресі автоматично і не відкриває посилання. Цей додаток коригує URL-адресу за допомогою нахилу та відкритої сторінки. addons.mozilla.org/en-US/seamonkey/addon/…
Самі

Що саме ви маєте на увазі під "катастрофічно невдачею"? Що станеться? Чи закриється браузер і виходить з ладу?
Пітер Мортенсен

7

Окрім наведених відповідей, варто згадати, що \широко використовується для спеціальних символів (наприклад \n \t) у мовах програмування, текстових редакторах та загальних системах, що застосовують лексичний аналіз.

Якщо ви програмуєте, наприклад, часом незручно потрібно навіть уникати зворотної косої риси з іншою ( \\), щоб правильно її використовувати - або потрібно використовувати рядки, що проходять, наприклад C # @"\test".

Звичайно, як уже згадувалося раніше, веб-URI використовують стандартну косу рису за стандартом але обидві риски працюють в останніх і найпоширеніших інструментах командного рядка.

ОНОВЛЕННЯ: Після невеликого пошуку, виявляється вся історія між /та\ повертається в "історію комп'ютерів", у віки DOS і тих систем на базі Unix того часу. HowToGeek має цікаву статтю про цю історію.

Коротко кажучи, DOS 1.0 спочатку був випущений IBM без підтримки каталогу, і / використовувався для іншої ("комутації") функцій команд. Коли каталоги були представлені у версії 2.0, /вона вже використовувалася, тому IBM обрала візуально найближчий символ, який був \. З іншого боку, Unix стандартно використовується /для каталогів.

Коли користувачі почали використовувати безліч різних систем, вони заплуталися, змусивши розробників ОС спробувати змусити системи працювати в обох випадках - це стосується навіть частини URL-адрес, оскільки деякі браузери підтримують http: \\ www.test. формат com \ go . Це мало недоліки, хоча в цілому, але все це сьогодні залишається причиною відсталої порівнянності, намагаючись підтримати обидва риски в Windows, хоча вони вже не базуються на DOS.


"обидві косої риски працюють у шляхах файлової системи." невірно, тому що Unix дуже злий, коли використовуєш ` as well as many оболонки make` ... ти маєш рацію, що нещодавно Windows визначила змінну середовища ALTERNATE_PATH_SEPARATOR, яка за замовчуванням у /Windows, ймовірно, може прийняти обидва.
Tomer W

1
@TomerW Windows NT завжди був сумісним з POSIX (хоча ранній POSIX все-таки був безлад, і деякі з них застрягли в Windows для зворотної сумісності). Це включало підтримуючі /шляхи скрізь у системі - звичайно, програми могли неправильно зрозуміти ці шляхи у вільний час, тому його не використовували занадто багато. Програми, що не стосуються CLI, які не намагалися зробити власну (розбиту) перевірку шляхів, спрацювали чудово з початку руху.
Луаан

@Luaan Windows мала можливість підтримувати багато функцій POSIX, але навряд чи я б сказав, що це "сумісність з POSIX". Звичайно, було кілька підсистем POSIX, які можна було використовувати протягом багатьох років, але вони були далеко не ідеальними. Windows 10 буде підтримувати Ubuntu bash, хоча пізніше цього літа разом із вбудованою підтримкою інструментів Linux, які постачаються з Ubuntu, тому ви можете стверджувати це в майбутньому, але ви, звичайно, не можете сказати "завжди".
ПК Luddite

@Luaan Якщо ви не "сумісний", ви маєте на увазі "cygwin працює".
ПК Luddite

@PCLuddite Ні, це було 100% сумісним POSIX.1c. Це не означає, що всі програми Unix працюють на ньому - більшість програм Unix не сумісні з POSIX :)
Луань

6

Ви не повинні використовувати жодне з C #. Ви завжди повинні використовувати Pathклас . Це містить метод, який називаєтьсяPath.Combine який можна використовувати для створення шляхів, не вказуючи роздільник самостійно.

Приклад використання:

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

5

\ використовується для локальних файлових шляхів Windows та мережевих шляхів, як у:

C:\Windows\Temp\ або \\NetworkSharedDisk\Documents\Archive\

/ це те, що потрібно для стандартних URI, як у:

http://www.stackoverflow.com/


2
@NikhilVartak, я додав приклади, хоча вважав, що моя початкова відповідь стосується всіх питань ОП.
Еш

3
Windows також розпізнає /в шляхах (принаймні 7 дій).
Кеннет К.

Ця відповідь далеко не повна.
reinierpost

Чи мали на увазі посилання на якісь ресурси, окрім лише головної сторінки Stack Overflow?
Тас

@reinierpost, моя відповідь ґрунтується на питанні ОП та пов'язаних з ними тегів. Як і деякі інші відповіді тут, я міг скопіювати щось із stackoverflow.com/questions/1589930/… та вставити його сюди, але це здалося надмірним. @tas, я мав намір покластись на сторінку stackoverflow або будь-яку гіперпосилання веб-сайту, щоб проілюструвати використання /URI в standarad, як я вже заявив у відповіді.
Еш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.