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

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

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

Ответ 1

/ - разделитель путей в 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, но эта другая история полностью), используйте /.


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

Ответ 2

MS-DOS 1.0 сохранил опцию символа командной строки (или переключателя) команды//из CP/M. В то время в файловой системе не было структуры каталогов и конфликтов.

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

A CONFIG.SYS entry SWITCHAR=- может использоваться для переопределения параметра / по умолчанию для улучшения совместимости с Unix. Это позволяет встроенные команды и стандартные утилиты использовать альтернативный символ. После этого разделитель путей Unix можно было бы однозначно использовать для имен файлов и каталогов. Эта запись была удалена в более поздних версиях, но DOS-вызов был документирован для установки значения после загрузки.

Это мало использовалось, и большинство сторонних инструментов остались неизменными. Путаница сохраняется. Многие порты инструментов Unix сохраняют символ "-", а некоторые поддерживают оба соглашения.

Следующий процессор команд PowerShell реализует строгие параметры экранирования и переключения и в значительной степени избегает путаницы, кроме тех случаев, когда используются устаревшие инструменты.

Ни вопрос, ни ответ не связаны с С#.

Ответ 3

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

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

Ответ 4

  • URL, стандартизованный в RFC 1738, всегда использует косые черты, независимо от платформы.
  • Путь к файлу и URI различаются. \ правильный в файле Windows путь и / верны в URI.
  • Несколько браузеров (а именно Firefox и Opera) катастрофически падают, когда сталкиваясь с URI с обратной косой чертой.
  • System.IO.Path.DirectorySeparatorChar для получения текущего разделителя путей

Этот может быть релевантным ресурсом.

Ответ 5

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

Если вы, например, программируете, иногда неудобно, нужно даже избегать обратной косой черты с другой (\\), чтобы использовать ее правильно - или нужно использовать экранирующие строки, такие как С# @"\test".

Конечно, как упоминалось ранее, веб-URI используют косую черту стандартным , но обе черты работают в последних и наиболее распространенных инструментах командной строки.

UPDATE: после небольшого поиска, кажется, что вся история между / и \ восходит к "истории компьютеров", в эпоху DOS и систем на базе Unix того времени. HowToGeek имеет интересную статью об этой истории.

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

http://www.stackoverflow.com/