Разница между косой чертой (/) и обратной косой чертой (\) в пути к файлу

153

Мне было интересно о разнице между \ и /в пути к файлам. Я заметил, что иногда путь содержит, /а иногда и с \.

Было бы здорово, если бы кто-нибудь мог объяснить, когда использовать \и/ .

Человек-паук
источник
4
Разница в каком контексте? Веб-контекст? Экранирование в строках C #? Это помечено с ASP.NET.
Питер Мортенсен
9
Возможный дубликат разницы между форвардом и обратной косой чертой
Питер Мортенсен
6
@ Питер, я бы закрыл более старый из-за этого, так как у него есть лучшие ответы.
Никель
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. Когда Microsoft и IBM расстались в 1990 году , Microsoft взяла тот код, который у них был, и создала Windows NT , на которой основаны все современные версии Windows, неся этот разделительный агностицизм.


Поскольку обратная совместимость была названием игры для Microsoft от всех основных переходов ОС, которые они предприняли (DOS к Win16 / DOS, к Win16 / Win32, к Win32 / WinNT), эта особенность застряла, и она, вероятно, будет существует какое-то время

Именно по этой причине существует это несоответствие. Это действительно не должно влиять на то, что вы делаете, потому что, как я уже сказал, WinAPI обычно может использовать их взаимозаменяемо. Однако сторонние приложения, вероятно, сломаются, если вы передадите, /когда они ожидают \между именами каталогов. Если вы используете Windows, придерживайтесь \. Если вы используете Unix или URI (которые основаны на путях Unix, но это совсем другая история), используйте /.


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

ПК Luddite
источник
57
И всегда комбинируйте пути, используя Path.Combine.
Ченг Чен
1
Интересный. Таким образом, в DOS или Windows это foo.exe /barможет быть интерпретировано как параметр командной строки, а foo.exe \barможет быть интерпретировано как обращение к файлу / папке с именем, barкоторый находится в корневом каталоге \текущего «диска», как, C:\например,.
Джеппе Стиг Нильсен
4
Следует отметить, что эта нормализация от /to \ выполняется на уровне совместимости Win32, а это означает, что если вы обойдете ее, будет разница. Наиболее известным примером этого являются пути с увеличенной длиной: \\?\C:\ в NTFS будет работать как положено, но \\?\C:/не будет.
Во
4
@PC Luddite: этот WinAPI может обрабатывать как /и ` is not entirely true. For network path you have to use `(например, \\ <имя_сервера> бот не // <имя_сервера>)
разнагул
2
@raznagul Правда. Я действительно не упомянул сетевые пути в своем ответе. Я придерживался в основном с общим типом filepath. Я добавлю это.
ПК 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 \это escape-символ, то есть \сообщает анализатору, что это пробел, а не конец оператора. В системах Unix /это разделитель каталогов.

В Windows \это разделитель каталогов, но его /нельзя использовать в именах файлов или каталогов.

CountryRabbit
источник
1
\ и /(а также несколько других символов) нельзя использовать в именах файлов, потому что в DOS не было такого же сложного парсера, к которому привыкли пользователи Unix. Отсутствие хорошего парсера было результатом того, что MS-DOS произошла от QDOS («Быстрая и грязная операционная система»). Он был предназначен для того, чтобы все работало быстро и на ограниченном оборудовании. Все это, конечно, все еще существует в настоящее время для обратной совместимости.
ПК Luddite
2
хорошо, стоит упомянуть, что в более поздних версиях Windows он /был добавлен как «Alternate_Directory_Separator»
Томер 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
user3163495
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, вероятно, может принять и то и другое.
Томер W
1
@TomerW Windows NT всегда была POSIX-совместимой (хотя ранняя версия POSIX была беспорядочной, и некоторые из них застряли в Windows для обратной совместимости). Это включало поддержку /путей повсюду в системе - конечно, приложения могли неправильно понимать эти пути в свободное время, поэтому они не использовались слишком часто. Приложения без CLI, которые не пытались выполнить собственную (неработающую) проверку путей, работали нормально с самого начала.
Луаан
@Luaan Windows была способна поддерживать многие функции POSIX, но вряд ли я бы сказал, что она «POSIX-совместимая». Конечно, было несколько подсистем POSIX, которые можно было использовать годами, но они были далеки от идеала. Windows 10 будет поддерживать Ubuntu bash, хотя позже этим летом вместе с собственной поддержкой инструментов Linux, поставляемых с Ubuntu, так что вы можете поспорить об этом в будущем, но вы, конечно, не можете сказать «всегда».
ПК Luddite
@Luaan Если под "совместимым" вы не подразумеваете "Cygwin works".
ПК Luddite
@PCLuddite Нет, он был на 100% совместим с POSIX.1c. Это не означает, что все приложения Unix работают на нем - большинство приложений Unix не POSIX-совместимы :)
Luaan
6

Вы не должны использовать ни в C #. Вы должны всегда использовать Pathкласс . Он содержит вызываемый метод, Path.Combineкоторый можно использовать для создания путей без указания разделителя самостоятельно.

Пример использования:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
TheLethalCoder
источник
5

\ используется для локальных путей к файлам Windows и сетевых путей, как в:

C:\Windows\Temp\ или \\NetworkSharedDisk\Documents\Archive\

/ это то, что требуется стандартными URI, как в:

http://www.stackoverflow.com/

ясень
источник
2
@NikhilVartak, я добавил примеры, хотя я думал, что мой первоначальный ответ касался всех вопросов ОП.
Эш
3
Windows также распознает /пути (по крайней мере, 7 делает).
Кеннет К.
Этот ответ далеко не полный.
reinierpost
Были ли у вас ссылки на некоторые ресурсы, кроме главной страницы Stack Overflow?
Tas
@reinierpost, мой ответ основан на вопросе ОП и связанных с ним тегах. Как и некоторые другие ответы здесь, я мог бы скопировать что-нибудь с stackoverflow.com/questions/1589930/… и вставить это здесь, но это показалось чрезмерным. @tas, я намеревался сделать ссылку на страницу stackoverflow или на любую гиперссылку веб-сайта, чтобы проиллюстрировать использование /стандартных URI, как я указал в ответе.
Эш