Пути в Windows


Путь к указанному файлу состоит из одного или нескольких компонентов, разделенных специальным символом (обратной косой чертой), причем каждый компонент обычно является именем каталога или именем файла, но с некоторыми заметными исключениями, описанными ниже. Это часто имеет решающее значение для интерпретации системы пути: как выглядит начало или префикс пути. Этот префикс определяет пространство имен, которое использует путь, и, кроме того, какие специальные символы используются в какой позиции в пути, включая последний символ.

Если компонент пути является именем файла, он должен быть последним компонентом.

Каждый компонент пути также будет ограничен максимальной длиной, указанной для определенной файловой системы. В общем, эти правила делятся на две категории: короткие и длинные. Обратите внимание, что имена каталогов хранятся в файловой системе как особый тип файла, но правила именования для файлов также применяются к именам каталогов. Таким образом, путь - это просто строковое представление иерархии между всеми каталогами, которые существуют для конкретного файла или имени каталога.

Полные и относительные пути

Для функций Windows API, которые управляют файлами, имена файлов часто могут быть относительно текущего каталога, в то время как некоторые API требуют полного пути. Имя файла относится к текущему каталогу, если оно не начинается со следующего:

  • UNC-имя любого формата, которое всегда начинается с двух символов обратной косой черты ("\\").
  • Обозначение диска с обратной косой чертой, например " C:\"или" d:\".
  • Одну обратную косую черту, например, "каталог \" или "\file.txt" Это также называется абсолютным путем.
Если имя файла начинается только с дискового указателя, но не с обратной косой черты после двоеточия, оно интерпретируется как относительный путь к текущему каталогу на диске с указанной буквой. Обратите внимание, что текущий каталог может быть или не быть корневым каталогом в зависимости от того, на что он был установлен во время последней операции "изменить каталог" на этом диске. Примеры такой формат выглядит следующим образом:

  • "C: tmp.txt " относится к файлу с именем "tmp.txt " в текущем каталоге на диске C.
  • "C:tempdir\tmp.txt " относится к файлу в подкаталоге к текущему каталогу на диске C.
Путь также считается относительным, если он содержит "две точки"; то есть два периода вместе в одном компоненте пути. Этот особый спецификатор используется для обозначения каталога над текущим каталогом, иначе известный как "родительский каталог". Примеры такого формата выглядит следующим образом:

  • "..\ tmp.txt " указывает на файл с именем tmp.txt, который расположен в родительском каталоге текущего каталога.
  • "..\..\ tmp.txt " указывает на файл, который расположен выше двух каталогов над текущим каталогом.
  • "..\ tempdir\tmp.txt " указывает файл с именем tmp.txt, который находится в каталоге с именем tempdir в том же каталоге текущего каталога.
Относительные пути могут объединять оба типа примеров, например " C:..\tmp.txt ". Это полезно, потому что, хотя система отслеживает текущий диск вместе с текущим каталогом этого диска, она также отслеживает текущие каталоги в каждом из разных букв диска (если ваша система имеет более одного), независимо от того, какой диск обозначается как текущий диск.

Максимальное ограничение длины пути

В API-интерфейсе Windows (с некоторыми исключениями, которые будут обсуждаться в следующих параграфах), есть максимальная длина пути в max_path, которая определяется как 260 символов. Локальный путь структурирован в следующем порядке: буква диска, двоеточие, обратная косая черта, компоненты имени, разделенные обратной косой чертой, и завершающий нулевой символ. Например, максимальный путь на диск D "D:\some 256-символьный путь строку ", где " " представляет собой невидимый символ NULL для текущей кодовой странице системы. (Символы < > используются здесь для наглядности и не могут быть частью допустимой строки пути.)

Функции файлового ввода/вывода в Windows API конвертируют "/" в "\" в рамках преобразования имени в НТ-имя типа, за исключением случаев использования "\\?\" префикса.

В Windows API есть множество функций, которые также имеют версии в формате юникода, чтобы разрешить путь расширенной длины для максимальной общей длины пути 32 767 символов. Этот тип пути состоит из компонентов, разделенных обратными косыми чертами, каждый до значения, возвращаемого в параметре Lpmaximumcomponentlength функции GetVolumeInformation (это значение обычно составляет 255 символов). Чтобы указать путь расширенной длины, используйте"\\?\" префикс. Например?\\" ?\D:\очень_длинный_путь".

Обратите внимание, что максимальный путь 32 767 символов является приблизительным, потому что"\\?\ "префикс может быть расширен до более длинной строки системой во время выполнения, и это расширение применяется к общей длине.

Этот же префикс также можно использовать с путями, построенными в соответствии с универсальным соглашением об именовании (UNC). Чтобы указать такой путь с помощью UNC, используйте"\\? \UNC\". Например?\\" ,\UNC-путь\ \ сервер\общий_ресурс", где "сервер" - имя компьютера и " общий_ресурс " - имя общей папки. Эти префиксы не используются как часть самого пути. Они указывают, что путь должен быть передан системе с минимальным изменением, а это означает, что вы не можете использовать прямые косые черты для представления разделителей пути, или точку для представления текущего каталога, или двойные точки для представления родительского каталога. Так как вы не можете использовать "\\?\ "префикс с относительным путем, относительные пути всегда ограничены в общей сложности числом символов MAX_PATH.

Нет необходимости выполнять какие-либо действия для нормализации юникода в строках путь и имя файла для файла Windows функций API ввода-вывода, поскольку файловая система обрабатывает путь и имена файлов как последовательность значений типа wchar. Любые нормализации, необходимые для вашего приложения должны быть выполнены с учетом этого, внешнего на любые вызовы, связанные с файлом Windows функции API ввода-вывода.

При использовании API для создания каталога указанный путь не может быть таким длинным, что невозможно добавить Имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12).

Оболочка и файловая система имеют различные требования. Можно создать путь с API Windows, который пользовательский интерфейс оболочки не в состоянии интерпретировать должным образом.

Начиная с Windows 10 версии 1607, ограничения MAX_PATH были удалены из общих Win32 файлов и каталогов функций. Тем не менее необходимо выбрать новое поведение. Рееста позволяет включить или отключить новое поведение длинного пути. Для включения длинных путей установить ключ реестра в

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Тип: reg_dword).
Значение ключа будет кэшироваться системой (на процесс) после первого вызова файла Win32 или функции каталога .Раздел реестра не будет перезагружен в течение всего срока действия процесса. Для того, чтобы все приложения в системе распознали значение ключа, может потребоваться перезагрузка, потому что некоторые процессы могли начаться до того, как ключ был установлен.

Вы также можете включить новое поведение длинного пути для каждого приложения через манифест:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
        <ws2:longPathAware>true
    </windowsSettings>
</application>
Эти функции управления каталогами, которые не будут иметь ограничения в max_path если вы включите длинные пути: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 3. Первая форма на Laravel
Онлайн разблокировка Folder Guard
Поля и методы в Java: правила вызова методов