• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#1
Еще м.б. "простенькая" задачка.
Собственно, есть путь (хотя, Вы можете привести и пару других вариантов написания ;)):

Код:
c:\каталог1\каталог2\файл.txt
Расскажите, для чего используется знак "\" (интересуют все варианты) ?
 

dzu

Активный пользователь
Сообщения
1,014
Симпатии
638
#2
обратный слеш?
 

shestale

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#4
shestale, еще как минимум, 3 интерпретации ;) (и все они не противоречат друг другу)

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

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

shestale

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#6
Да. Конечно.

Код:
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 случаев...
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#10

Phoenix

Активный пользователь
Сообщения
2,088
Симпатии
2,035
#11
по 1 и 2-му частично вот иллюстрация.
Код:
C:\Users\жмека>cd users
Системе не удается найти указанный путь.

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

Dragokas

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

Phoenix

Активный пользователь
Сообщения
2,088
Симпатии
2,035
#13
Код:
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,841
Симпатии
5,578
#14
Phoenix, скорее всего подразумевалось файл без расширения. Точка и отсутствие слеша в конце говорит что это файл, а последний слеш покажет что это папка. Кстати в программировании есть такая функция

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#15
Да. Концевой слеш однозначно идентифицирует то, что последним копонентом в указанном пути является папка, а не файл.
Да. \ - обратный слэш. / - обычный (прямой) слеш.

Норма для пути в ОС 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
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#16
\file.txt

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

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

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

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

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

ScriptMakeR

Клуб переводчиков
Сообщения
1,445
Симпатии
515
#17
Dragokas,
Другими словами, система запоминает последний открытый каталог на диске и, при переходе на этот диск без указания корня, открывает последний открытый каталог?
 

Dragokas

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

Сергей

Активный пользователь
Сообщения
302
Симпатии
149
#19
Да. Конечно.

Код:
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
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,412
Симпатии
5,277
#20
А мне кажется, что все варианты есть частными случаями \\?\c:\каталог1\
Нет, не дописывает. Все на совести разработчика.
К тому же запись вида \\?\ может быть корректно обработана только внутри юникодных функций, при том не всех, и будет также означать отмену ограничения в макс. длину пути.

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

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