Что означает символ обратного слеша "\" в пути

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Еще м.б. "простенькая" задачка.
Собственно, есть путь (хотя, Вы можете привести и пару других вариантов написания ;)):

Код:
c:\каталог1\каталог2\файл.txt

Расскажите, для чего используется знак "\" (интересуют все варианты) ?
 

dzu

Ветеран
Сообщения
1,050
Реакции
670
Баллы
593
обратный слеш?
 

shestale

Ассоциация VN/VIP
Преподаватель
Сообщения
9,699
Реакции
4,656
Баллы
843
"\" - означает что перед ним родительский каталог, а после это то, что находиться в нем...разве может быть другая интерпретация?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
shestale, еще как минимум, 3 интерпретации ;) (и все они не противоречат друг другу)

"\" - означает что перед ним родительский каталог
не обязательно. Не все из слешей, указанных выше.

++ Что если слеши стоят:
- в самом начале пути ?
- в самом конце пути ?
 
Последнее редактирование:

shestale

Ассоциация VN/VIP
Преподаватель
Сообщения
9,699
Реакции
4,656
Баллы
843
Расскажите, для чего используется знак "\" (интересуют все варианты) ?
Dragokas, ты примеры приведи, а то не понятно откуда это, и ответы могут поэтому отличаться от того о чем ты спрашиваешь.
п.с.
Расскажите, для чего используется знак "\" (интересуют все варианты) ?
В математике обратная косая черта обозначает разность множеств:
2958d3ea0159c6ad2ed45f5804fce621.png
— множество элементов, которые входят в A, но не входят в B.
В Юникоде для этого есть также специальный знак «set minus» (U+2214, ∖).
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Да. Конечно.

Код:
c:\каталог1\каталог2\файл.txt
означает что перед ним родительский каталог
Если исходить из этого правила, то получится, что:
c: - будет родительским каталогом для "каталог1". Это не так.
Ты может проверить это, запустив консоль и введя:
Код:
d:
где d - буква любого существующего у тебя диска, кроме системного.
Затем вводишь:
Код:
c:
и обрати внимание, в какой папке ты окажешься.
Прямой ответ сознательно не даю.

Итак, пишу варианты, в которых слеш \ имеет особое значение:
1)
\каталог1\каталог2\файл.txt
аналогичное правило для:
c:\каталог1\каталог2\файл.txt

2)
каталог1\каталог2\

3)
\\?\c:\каталог1
и похожая конструкция с чуть отличающимся смыслом:
\\.\c:\каталог1

4)
\\server\share

Вот и хотелось бы разжечь интерес участников форума вопросом:
что означает \ для каждого из 4 случаев...
 
Последнее редактирование:

Phoenix

Ветеран
Сообщения
2,108
Реакции
1,839
Баллы
593
по 1 и 2-му частично вот иллюстрация.
Код:
C:\Users\жмека>cd users
Системе не удается найти указанный путь.

C:\Users\жмека>cd \users
C:\Users>
а так обратно, на уровень выше.
Код:
C:\Users>cd жмека\
C:\Users\жмека>
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Phoenix, на счет концевого слеша. Создай файл file
и проверь его наличие:
Код:
if exist file\ echo Y
if exist file echo Y
Здесь будет ощущатся разница.
Так что, догадались, что означает начальный слеш ?
 

Phoenix

Ветеран
Сообщения
2,108
Реакции
1,839
Баллы
593
Код:
C:\Users\жмека>if exist file.txt\ echo Y
C:\Users\жмека>if exist file.txt echo Y
Y

Код:
C:\Users\жмека>cd..
C:\Users>
Ну вот известная команда - так переходит на уровень ниже.. :Dash1:
 
Последнее редактирование:

Drongo

Ассоциация VN/VIP
Разработчик
Сообщения
7,834
Реакции
5,561
Баллы
898
Phoenix, скорее всего подразумевалось файл без расширения. Точка и отсутствие слеша в конце говорит что это файл, а последний слеш покажет что это папка. Кстати в программировании есть такая функция

ExtractFileExt() - извлечение расширения из файла. Но вот какая бяка, когда скажем ты записываешь строку Test.MyFolder
Код:
ExtractFileExt("Test.MyFolder")
То функция вернёт тебе .MyFolder, даже если это будет имя папки записаное с точкой.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Да. Концевой слеш однозначно идентифицирует то, что последним копонентом в указанном пути является папка, а не файл.
обратный слеш?
Да. \ - обратный слэш. / - обычный (прямой) слеш.

Норма для пути в ОС Windows - это обратный слеш.
Если указать вместо него обычный:
Код:
c:/каталог/файл
файловая система это нормально скушает.

Поясню, приведя вольный перевод выдержек из справки:
Каждый раз, когда Вы куда-либо вводите путь (в строку проводника или в некоторых функциях в программировании)
происходит так называемая нормализация пути:
- слешы / заменяются на обратные \
- переменные окружения, например %windir%, раскрываются в полный путь
- относительный путь преобразовуется в полный, в том числе раскрываются точки (.) и (..),
например, c:\path1\path2\..\file преобразовуется в c:\path1\file
(.. - обзначает ссылка на родительский каталог; . - означает ссылка на текущий каталог)
- происходит проверка корректности семантики символов. Так, нижеуказанные символы имеют специальное значение
и не могут быть использованы для именования файловых объектов:
  • < (знак меньше)
  • > (знак больше)
  • : (двоеточие)
  • " (кавычка)
  • / (прямой слеш)
  • \ (обратный слеш)
  • | (вертикальная черта или канал)
  • ? (знак вопроса)
  • * (звездочка)
  • символы с кодом ASC от 1 до 31, кроме именования файловых потоков, где это разрешено
  • символ NUL (ASC = 0), который обозначает окончание строки
- проверка ограничения на маскимальную длину пути в 260 символов (константа MAX_PATH): C:\строка длинной 256 символов<NUL>
При этом для каталогов остается еще меньше символов: 260 - (8 + 3 + 1) = 248, т.е. C:\каталог(и) длинной 243 символа\файл длинной 8.3<NUL>
8.3 - означает 8 символов для имени и 3 символа - для расширения имени.
- путь не должен заканчиваться знаком пробела или точкой.
- отсутствие зарезервированных системой имен CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.

Большинство правил нормализации перестают действовать,
если в начале пути указать специальный набор символов: \\?\ - это будет работать только в юникодных функциях.

Таким образом, можно создать файл, который обычным способом удалить нельзя.
Кроме того, отключается проверка на максимальную длину пути,
которая теперь станет достигать ~32767 символов с ограничением в 255 символов для каждого компонента в таком пути.

\\.\ - используется для прямого доступа к устройствам (но не файлам) через специальніе API-функции. Пример \\.\PhysicalDiskX, \\.\COM100, \\.\CdRomX
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
\file.txt

Если слеш стоит вначале (или после двоеточия C:\) - он обозначает корень текущего диска.
Вы можете это проверить, открыв любую папку в проводнике и введя знак \ а за ним любое имя файла из корня диска.

C:
C:
- не всегда является корнем. Двоеточие после буквы диска - означает текущий каталог на этом диске.

Текущий каталог - это папка, путь которой хранится вместе с другими данными о процессе.
При этом путь к текущему каталогу запоминается для каждого из дисков.
Приведем пример:
curr_test.png


Если текущий каталог более не существует на диске, он автоматически сменяется на корневой каталог.
По-умолчанию, текущим каталогом для других дисков также является их корневой каталог.

По умолчанию, при создании процесса, текущим каталогом для него становится:
1) если процесс создан с обычными правами, то каталог родительского процесса (если иное не было задано в параметрах функции CreateProcess, например, с помощью ключа /D команды Start);
2) если процесс запущен с повышенными привилегиями через механизм UAC, то папка %SystemRoot%\System32
 
Последнее редактирование:

ScriptMakeR

Клуб переводчиков
Сообщения
1,461
Реакции
513
Баллы
353
Dragokas,
Другими словами, система запоминает последний открытый каталог на диске и, при переходе на этот диск без указания корня, открывает последний открытый каталог?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
ScriptMakeR, не система - каждый процесс в системе.
при переходе на этот диск без указания корня, открывает последний открытый каталог?
Да, если указать вот так D:
Только нужно учитывать, что программа, с которой ты экспериментируешь, может иметь свою внутреннюю реализацию нормализации пути,
и подставлять вместо D: - D:\. Проводник, например, такую замену делает.
 

Сергій

Разработчик
Сообщения
555
Реакции
289
Баллы
378
Да. Конечно.

Код:
c:\каталог1\каталог2\файл.txt

Если исходить из этого правила, то получится, что:
c: - будет родительским каталогом для "каталог1". Это не так.
Ты может проверить это, запустив консоль и введя:
Код:
d:
где d - буква любого существующего у тебя диска, кроме системного.
Затем вводишь:
Код:
c:
и обрати внимание, в какой папке ты окажешься.
Прямой ответ сознательно не даю.

Итак, пишу варианты, в которых слеш \ имеет особое значение:
1)
\каталог1\каталог2\файл.txt
аналогичное правило для:
c:\каталог1\каталог2\файл.txt

2)
каталог1\каталог2\

3)
\\?\c:\каталог1
и похожая конструкция с чуть отличающимся смыслом:
\\.\c:\каталог1

4)
\\server\share

Вот и хотелось бы разжечь интерес участников форума вопросом:
что означает \ для каждого из 4 случаев...
А мне кажется, что все варианты есть частными случаями \\?\c:\каталог1\, просто система сама дописывает "в уме" то, чего не хватает в предложенной ей записи, и дописивыет тем, что поумолчанию или "под рукой".
А если вспомнить про иерархию файловой системы, то "\" - некий розделитель в таблице вложений...
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
А мне кажется, что все варианты есть частными случаями \\?\c:\каталог1\
Нет, не дописывает. Все на совести разработчика.
К тому же запись вида \\?\ может быть корректно обработана только внутри юникодных функций, при том не всех, и будет также означать отмену ограничения в макс. длину пути.

Также отдельно стоит выделить такую запись:
\\Server\Share
Называется это - UNC (Universal Naming Convention) и задает Server - имя сервера в локальной сети
и Share - имя расшаренной папки на этом сервере.

Для такой записи также доступна отмена нормализации пути.
Чтобы ее применить, используйте префикс \\?\UNC\ например:
Код:
\\?\UNC\Server\Share
 
Сверху Снизу