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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Dragokas, 12 дек 2014.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Еще м.б. "простенькая" задачка.
    Собственно, есть путь (хотя, Вы можете привести и пару других вариантов написания ;)):

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

    dzu Активный пользователь

    Сообщения:
    957
    Симпатии:
    543
    обратный слеш?
     
  3. shestale
    Оффлайн

    shestale Ассоциация VN/VIP Преподаватель

    Сообщения:
    8.061
    Симпатии:
    4.488
    "\" - означает что перед ним родительский каталог, а после это то, что находиться в нем...разве может быть другая интерпретация?
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    shestale, еще как минимум, 3 интерпретации ;) (и все они не противоречат друг другу)

    не обязательно. Не все из слешей, указанных выше.

    ++ Что если слеши стоят:
    - в самом начале пути ?
    - в самом конце пути ?
     
    Последнее редактирование: 12 дек 2014
  5. shestale
    Оффлайн

    shestale Ассоциация VN/VIP Преподаватель

    Сообщения:
    8.061
    Симпатии:
    4.488
    Dragokas, ты примеры приведи, а то не понятно откуда это, и ответы могут поэтому отличаться от того о чем ты спрашиваешь.
    п.с.
     
    fseto и Dragokas нравится это.
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Да. Конечно.

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

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

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

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

    4)
    \\server\share

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

    Alex1983 Разработчик

    Сообщения:
    852
    Симпатии:
    523
    Если Patch превышает 256 (если не ошибаюсь) символов то применяется данная последовательность. Это в программирование.
     
  8. shestale
    Оффлайн

    shestale Ассоциация VN/VIP Преподаватель

    Сообщения:
    8.061
    Симпатии:
    4.488
    как обычно здесь: C:\Windows\System32>
     
  9. Alex1983
    Оффлайн

    Alex1983 Разработчик

    Сообщения:
    852
    Симпатии:
    523
    У меня в папке пользователя
    Код (Text):
    C:\Users\Aibolit
     
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Как видишь, это оказалась не родительская папка для "каталог1".
     
  11. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.857
    Симпатии:
    1.842
    по 1 и 2-му частично вот иллюстрация.
    Код (Text):
    C:\Users\жмека>cd users
    Системе не удается найти указанный путь.

    C:\Users\жмека>cd \users
    C:\Users>
    --- Объединённое сообщение, 12 дек 2014, Дата первоначального сообщения: 12 дек 2014 ---
    а так обратно, на уровень выше.
    Код (Text):
    C:\Users>cd жмека\
    C:\Users\жмека>
     
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Phoenix, на счет концевого слеша. Создай файл file
    и проверь его наличие:
    Код (Text):
    if exist file\ echo Y
    if exist file echo Y
    Здесь будет ощущатся разница.
    --- Объединённое сообщение, 12 дек 2014 ---
    Так что, догадались, что означает начальный слеш ?
     
    Drongo нравится это.
  13. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.857
    Симпатии:
    1.842
    Код (Text):
    C:\Users\жмека>if exist file.txt\ echo Y
    C:\Users\жмека>if exist file.txt echo Y
    Y
    Код (Text):
    C:\Users\жмека>cd..
    C:\Users>
    Ну вот известная команда - так переходит на уровень ниже.. :Dash1:
     
    Последнее редактирование: 12 дек 2014
  14. Drongo
    Оффлайн

    Drongo Ассоциация VN/VIP Разработчик

    Сообщения:
    7.905
    Симпатии:
    8.222
    Phoenix, скорее всего подразумевалось файл без расширения. Точка и отсутствие слеша в конце говорит что это файл, а последний слеш покажет что это папка. Кстати в программировании есть такая функция

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Да. Концевой слеш однозначно идентифицирует то, что последним копонентом в указанном пути является папка, а не файл.
    --- Объединённое сообщение, 13 дек 2014, Дата первоначального сообщения: 13 дек 2014 ---
    Да. \ - обратный слэш. / - обычный (прямой) слеш.

    Норма для пути в ОС Windows - это обратный слеш.
    Если указать вместо него обычный:
    Код (Text):
    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
     
    Последнее редактирование: 13 дек 2014
    dzu, Drongo, ScriptMakeR и 2 другим нравится это.
  16. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    \file.txt

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

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

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

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

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

    ScriptMakeR Студент 1 курс

    Сообщения:
    1.307
    Симпатии:
    449
    Dragokas,
    Другими словами, система запоминает последний открытый каталог на диске и, при переходе на этот диск без указания корня, открывает последний открытый каталог?
     
  18. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    ScriptMakeR, не система - каждый процесс в системе.
    Да, если указать вот так D:
    Только нужно учитывать, что программа, с которой ты экспериментируешь, может иметь свою внутреннюю реализацию нормализации пути,
    и подставлять вместо D: - D:\. Проводник, например, такую замену делает.
     
  19. Сергей
    Оффлайн

    Сергей Активный пользователь

    Сообщения:
    254
    Симпатии:
    120
    А мне кажется, что все варианты есть частными случаями \\?\c:\каталог1\, просто система сама дописывает "в уме" то, чего не хватает в предложенной ей записи, и дописивыет тем, что поумолчанию или "под рукой".
    --- Объединённое сообщение, 15 дек 2014 ---
    А если вспомнить про иерархию файловой системы, то "\" - некий розделитель в таблице вложений...
     
  20. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Нет, не дописывает. Все на совести разработчика.
    К тому же запись вида \\?\ может быть корректно обработана только внутри юникодных функций, при том не всех, и будет также означать отмену ограничения в макс. длину пути.

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

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

Поделиться этой страницей