Максимальная длина пути к файлу: Именование файлов, путей и пространств имен — Win32 apps

Содержание

Как в Windows 10 отключить ограничение на длину пути в 260 символов

Облако на Openstack

Готовые облачные серверы от 0,53 ₽/час

Низкая стоимость, почасовая оплата

‘; break; case 1: document.getElementById(«banner_registrator»).innerHTML = ‘

‘; break; case 2: document.getElementById(«banner_registrator»).innerHTML = ‘

Облачные VPS от 0.5 ₽/час

  • ISO + готовые ОС и приложения
  • Django, Docker, LAMP, LEMP, Node.JS
  • Масштабирование на лету и SnapShot

‘; break; }

WinITPro.ru  /  Windows 10  /  Как в Windows 10 отключить ограничение на длину пути в 260 символов


07.04.2020

Большинство администраторов и пользователей Windows при работе с файлами, так или иначе сталкивались с ошибкой “path too long”. Эта ошибка возникает при превышении полного пути к файлу (вместе с его именем) значения 260 символов.

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

В новой сборке Windows 10 Insider Preview Build 14352 доступной участникам программы Windows Insider, появилась новая возможность отключить ограничение на максимальную длину пути.

Отключить ограничение MAX_PATH можно двумя способами: с помощью редактора групповых политик или через реестр. Рассмотрим оба:

  1. Запустите консоль редактора локальной групповой политики, нажав Win+R и выполнив команду gpedit.msc
  2. Перейдите в раздел редактора Local Computer Policy ->
    Computer
    Configuration -> Administrative Templates -> System -> Filesystem -> NTFS (Конфигурация компьютера -> Административные шаблоны -> Система -> Файловая система -> NTFS)
  3. Откройте политику Enable NTFS long paths
  4. Включите политику, переведя ее в состояние Enabled
  5. Сохраните изменения

При использовании домашней версии Windows 10, в которой отсутствует редактор GPO, это же изменение можно внедрить с помощью редактора реестра.

  1. Запустите редактор реестра regedit.exe
  2. Перейдите в ветку HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  3. Создайте в данной ветке новый параметр типа
    Dword
    (32-bit) Value с именем LongPathsEnabled
  4. Чтобы отключить ограничение MAX_PATH, измените значение ключа на 1
  5. Также вы можете включить эту функцию одной командой PowerShell:
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1

Для вступления изменений в силу в обоих случаях требуется перезагрузка компьютера. После перезагрузки пользователи и программы смогут без ограничений работать с файлами, длина пути к которым превышает 260 символов. Теперь на файлы будет действовать только ограничение файловой системы NTFS – 32767 символов .

Этот функционал доступен всем пользователям Windows 10, начиная с Anniversary Update (1607), и в Windows Server 2016.


Предыдущая статьяСледующая статья




Слишком длинный целевой путь, решаем за минуту

Обновлено 28.11.2020

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов Pyatilistnik.org. В прошлый раз мы с вами разобрали возможности утилиты PING, рассмотрели как ее применять на практике. В сегодняшней публикации я вам покажу, как устраняется боль и печаль в операционных системах Windows, я говорю про длинные пути, в своей практике я очень часто встречал жалобы «Слишком длинный целевой путь» или «Слишком длинный конечный путь«, то же самое вы можете встретить и при удалении. Ниже я покажу, как выкручиваться из данной ситуации.

Описание проблемы длинных путей

Раньше имена файлов в Windows ограничивались форматом 8. 3 — всего восемь символов для имени файла и три для расширения. С появлением Windows 95 Microsoft сняла этот предел и позволила использовать гораздо более длинные имена.

Тем не менее, файловая система Windows по-прежнему накладывает некоторые ограничения, например, какие символы могут использоваться в именах файлов и общую длину путей. Некоторое время максимальная длина пути составляла 260 символов, но с появлением Windows 10, часть ограничений начала потихоньку уходить, например для приложений и появилась возможность отключить проверку MAX_PATH и использовать длинные пути без префикса \\?\.

Что интересно, значение в 260 символов обусловлено значением MAX_PATH Win32 API. У файловой системы NTFS максимальная длина пути ″немного″ больше и составляет  32767 символа. Для обхода ограничений Win32 API некоторые приложения используют формат UNC, указывая абсолютный путь с префиксом \\?\, например так:

\\?\C:\директория\поддиректория\имя файла

Хочу отметить, что на период ноября 2020 года и последней версий Windows 10 1909, в ПРОВОДНИКЕ Windows до сих пор есть ограничения в 260 символов, и мы все слышим обещания, что их исправят

Большинство людей может и не столкнуться с ней, а вот почти каждый системный администратор обязательно это увидит. Тут все дело в том, что в большинстве организаций есть свои сетевые файловые ресурсы, через которые пользователи производят обмен и работу с документами. В какой-то момент люди могут создать такой путь, который будет 258 или 260 символов, попытаются туда скопировать файл, а им выдастся ошибка:

Слишком длинный целевой путь: Имена файлов слишком длинны для помещения в эту целевую папку. Попробуйте использовать более короткое имя имя файла или расположение с более коротким путем

Тоже самое при копировании в папку, так же выскакивает «Слишком длинный целевой путь».

Вот ошибка при извлечении архива в сетевую папку:

Не удается завершить извлечение. Слишком длинный конечный путь. Переименуйте сжатую ZIP-папку и повторите попытку

Методы снимающие ограничения на длину пути в Windows

  • Через групповую или локальную политику Windows (Применимо только к Windows 10 и Windows Server 2016 и выше)
  • Через реестр Windows (Применимо только к Windows 10 и Windows Server 2016 и выше)
  • Через сторонние утилиты 7-Zip, Far, TotalCommander (Применимо ко всем версиям Windows)
  • Использование силинков (символических ссылок) (Применимо ко всем версиям Windows)
  • Через сетевой диск, для укорачивания пути
  • Утилиты xcopy, robocopy

Нюансы длинных путей в приложениях

Есть один нюанс.  Этот новый параметр (имеется ввиду та политика и ключ реестра) не обязательно будет работать со всеми существующими приложениями, но он будет работать с большинством. В частности, любые современные приложения должны работать нормально, как и все 64-битные приложения. Старые 32-разрядные приложения должны быть применимы для работы, что на самом деле просто означает, что разработчик указал в файле манифеста приложения, что приложение поддерживает более длинные пути. Большинство популярных 32-битных приложений не должно вызывать проблем. Тем не менее, вы ничем не рискуете, пробуя настройку. Если приложение не работает, единственное, что произойдет, это то, что оно не сможет открывать или сохранять файлы, сохраненные в местах, где полный путь превышает 260 символов.

Если вы разработчик, то чтобы ваше приложение имело возможность работать с длинными путями Windows, в манифесте обязательно указывайте следующие настройки:

<application xmlns=»urn:schemas-microsoft-com:asm.v3″>
<windowsSettings>
<longPathAware xmlns=»http://schemas. microsoft.com/SMI/2016/WindowsSettings»>true</longPathAware>
</windowsSettings>
</application>

Как в Windows 10 отключить ограничение на длину пути в 260 символов через политику

Чем примечателен данный метод, так это тем, что неподготовленных пользователей он не вынуждает выполнять команды или производить правку реестра, тут все в графическом виде. Так же если у вас есть домен Active Directory и вы хотите массово убрать ошибки «Слишком длинный целевой путь» или «Слишком длинный конечный путь» в приложениях и запретить им проверять MAX_PATH и использовать длинные пути без префикса \\?\, то групповые политики вам это помогут.

Еще раз напоминаю, что данный метод подойдет и для серверных версий, даже самых современных Windows Server 2019

Покажу для начала, как делать через локальную политику, открываете окно «Выполнить» в котором пишите gpedit.msc.

Хочу отметить, что для Windows 10 Home данный метод работать не будет, там просто нет редактора локальных политик, там придется лезть в реестр Windows

Далее идем по пути:

Конфигурация компьютера — Административные шаблоны — Система — Файловая система (Computer configuration — Administrative templates — System — Filesystem)

Найдите тут параметр «Включить длинные пути Win32 (Enable Win32 long paths)«, по умолчанию он отключен, и я честно не понимаю почему. Активируйте его.

То же самое вы можете сделать централизовано для массового управления через групповые политики, все ветки те же самые.

Как я писал выше, в проводнике это не даст ни каких эффектов, поэтому вы все так же будите получать ошибку при копировании, создании, удалении «Слишком длинный целевой путь» или «Слишком длинный конечный путь«. Ниже я покажу, что делать если нужно что-то там удалить или изменить. Данное ограничение в длине пути теперь не подхватиться на лету всеми приложениями, потребуется перезагрузка.

Включение поддержки длинных путей через реестр

Данный метод ни чуть не сложнее предыдущего и делает все то же самое, включает поддержку длинных путей свыше 256 символов для приложений Windows. Когда вы что-то меняете через редактор политик, по сути меняются настройки в реестре, это нужно помнить и знать. Сейчас я вам покажу какой ключ меняется. Откройте редактор реестра Windows.  Перейдите в раздел:

HKLM\System\CurrentControlSet\Control\FileSystem

тут вам необходимо найти параметр LongPathEnabled, которому для активации поддержки длинных путей и изменения ограничений в MAX_PATH, нужно задать значение «1».  Тут потребуется перезагрузка.

СКАЧАТЬ ГОТОВЫЕ КЛЮЧИ ДЛЯ АКТИВАЦИИ ОПЦИИ ПОДДЕРЖКИ ДЛИННЫХ ПУТЕЙ

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

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

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\ CurrentVersion\Group Policy Objects\ {48981759-12F2-42A6-A048-028B3973495F} Machine\System\CurrentControlSet\Policies

Если там нет ключа LongPathsEnabled, то создайте его, тип DWORD (32 бита) и значение 1.

Как в Windows 10 отключить ограничение на длину пути в 260 символов через PowerShell

Не все люди готовы копаться в редакторах и реестрах, им нужно быстрое решение, одним из таких является PowerShell. В оболочке выполните команду для активации параметра «Включить длинные пути Win32 (LongPathEnabled)». Не забываем перезагрузить систему.

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1

Как удалять, копировать, переносить файлы и папки при ошибке с длинными путями

Разобравшись с тем, как отключить проверку MAX_PATH в приложениях, давайте теперь поймем и научимся решать проблему длинных путей на файловых шарах и просто в проводнике. Классическая ситуация, когда пользователь попытался перенести свой файл или удалить его, создать папку и так далее, и он получает ошибку с пресловутыми длинными путями. Он просит разобраться вас и тут начинаются танцы с бубнами, вы просите его либо переименовать часть пути, или попросить его произвести действия в другом расположении, или просто забить, сказав, что виновата Windows со своими ограничениями, но мы же с вами профессионалы и инженеры, поэтому должны уметь выходить из таких ситуаций.

Как в Windows 10 отключить ограничение на длину пути в 260 символов через командную строку

Запустите командную строку в режиме администратора и введите:

reg add «HKLM\SYSTEM\CurrentControlSet\Control\FileSystem» /v LongPathsEnabled /t REG_DWORD /d 1

Потребуется перезагрузка.

Обход ограничений длинных путей через 7zFM

Наверняка многие знают архиватор 7Zip, но мало кто пользуется его файловым менеджером 7zFM.exe, а зря именно он может вам помочь в ситуации с сообщением «Слишком длинный целевой путь» или «Слишком длинный конечный путь».  Вот у меня есть тестовая директория, у которой уже есть 260 символов в пути, и я не могу там создавать новую папку.

Откройте 7zFM.exe и перейдите в нем в конечную папку вашего пути.

Скачать 7zFM.exe Porable вы можете по ссылке

Для создания новой папки нажмите клавишу F7.

Задайте необходимое вам имя, в моем примере это будет «БОльше 260 Microsot«.

В результате у нас создалась новая папка и заметьте 7zFM не ругнулся на наличие длинных путей, он их игнорирует просто и все.

 

Проверяем, что директория доступна через проводник Windows.

Все прекрасно отображается. Теперь я думаю вы легко сможете переносить, копировать, удалять файлы через 7zFM, когда вам проводник Windows ругается на наличие длинных путей.

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

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

  • Путь где будет лежать файл символической ссылки — в моем примере C:\короткий путь
  • Длинный путь — C:\Share\WINDOW~1\C73D~1\C6BF~1 \D915~1\5C04~1\B4E5~1\260MIC~1

Нам поможет команда mklink, где ключ /D создает ссылку на каталог

mklink /D «C:\короткий путь» «C:\Share\WINDOW~1\ C73D~1\C6BF~1\D915~1\5C04~1\B4E5~1\260MIC~1»

Символическая ссылка успешно создана, можно проверять.

Откройте каталог с укороченным путем и попробуйте создать просто папку, в итоге она будет создана именно по тому длинному пути, как видите легко можно обходить ограничение в 260 символов.

 

Как обойти ограничение длинных путей через сопоставление subst

subst — простая команда позволяющая связать нужный путь к каталогу с буквой диска. Так же откройте командную строку в режиме администратора и сопоставьте ваш длинный путь с буквой W.

subst W: «C:\Share\WINDOW~1\C73D~1\C6BF~1\ D915~1\5C04~1\B4E5~1\260MIC~1»

У вас в проводнике Windows должен появиться диск с данной буквой, если его нет, то прочитайте статью «Не появляется диск после команды subst» или просто в проводнике вбейте W:\ и нажмите Enter.

Как обойти ограничение длинных путей через монтирование сетевого диска

В командной строке используйте команду net use, далее буква диска, которую мы присваиваем и в самом конце путь:

net use Z: «\\DESKTOP-OJ0SCOE\Share\WINDOW~1\ C73D~1\C6BF~1\D915~1\5C04~1\B4E5~1\260MIC~1» /persistent:yes

Как видим все прекрасно отработало и диск появился.

Использование утилит Far или Total Commander

После включения параметра «Включить длинные пути Win32» данные утилиты в 100% случаев помог вам произвести любые действия с папками или файлами на любом длинном пути в системе Windows. Откройте Total Commander и создайте для примера папку в каталоге с длинным путем, напоминаю для этого нужно нажать F7.

Как видите все прекрасно создается, удаляется или копируется при желании.

Как еще обойти проблему с длинными путями Windows

В мир виртуализации и облаков, многие компании переносят свои файловые ресурсы именно туда. Например в моей компании используют для хранения большинства данных это Google Drive, кто-то диски mail.ru или Яндекса, не нужно этого бояться, главное смотрите, чтобы это подходило с юридической точки зрения но и не нужно лукавить это может стоить дополнительных расходов, но зато ни каких длинных путей, вышедших из строя дисков в RAID, место наращивается на лету, короче одни плюсы.

На этом у меня все, мы разобрали как исправляются ошибки «Слишком длинный целевой путь» или «Слишком длинный конечный путь«, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Ограничение максимальной длины пути — приложения Win32

  • Статья
  • 4 минуты на чтение

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

(Символы < > используются здесь для наглядности и не могут быть частью действительной строки пути .)

Например, вы можете столкнуться с этим ограничением, если клонируете репозиторий git с длинными именами файлов в папку, которая сама имеет длинное имя. /» на «\» как часть преобразования имени в имя в стиле NT, за исключением случаев использования префикса «\\?\», как подробно описано в следующих разделах.

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

очень длинный путь «.

Примечание

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

Префикс «\\?\» также можно использовать с путями, созданными в соответствии с универсальным соглашением об именах (UNC). Чтобы указать такой путь с помощью UNC, используйте префикс «\\?\UNC\». Например, » \\?\UNC\server\share», где «server» — это имя компьютера, а «share» — имя общей папки. Эти префиксы не используются как часть самого пути. Они указывают, что путь должны быть переданы в систему с минимальными изменениями, что означает, что вы не можете использовать косую черту для представления разделителей путей, точку для представления текущего каталога или двойные точки для представления родительского каталога. Поскольку вы не можете использовать «\\? \» с относительным путем, относительные пути всегда ограничены

MAX_PATH символов.

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

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

минус 12).

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

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

Чтобы включить новое поведение длинного пути, должны быть выполнены оба следующих условия:

  • Раздел реестра Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled (тип: REG_DWORD) должен существовать и иметь значение 1. Значение ключа будет кэшировано системой (для каждого процесса) после первого вызов затронутого файла Win32 или функции каталога (список функций см. ниже). Раздел реестра не будет перезагружаться в течение всего времени существования процесса. Чтобы все приложения в системе распознали значение ключа, может потребоваться перезагрузка, поскольку некоторые процессы могли быть запущены до установки ключа.

Вы также можете скопировать этот код в файл .reg , который может установить это для вас, или использовать команду PowerShell из окна терминала с повышенными привилегиями:

  • Файл реестра (.reg)
  • PowerShell
 Редактор реестра Windows версии 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
 

Примечание

Этот раздел реестра также можно контролировать с помощью групповой политики в Конфигурация компьютера > Административные шаблоны > Система > Файловая система > Включить длинные пути Win32 .

  • Манифест приложения также должен включать элемент longPathAware .

     <приложение xmlns="urn:schemas-microsoft-com:asm.v3">
        
            true
        
    
     

Это функции управления каталогами, которые больше не имеют ограничений MAX_PATH , если вы соглашаетесь на использование длинного пути: CreateDirectoryW, CreateDirectoryExW GetCurrentDirectoryW RemoveDirectoryW SetCurrentDirectoryW.

Это функции управления файлами, которые больше не имеют ограничений MAX_PATH , если вы соглашаетесь на использование длинного пути: GetFileAttributesExW, SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.

Именование файлов, путей и пространств имен — приложения Win32

  • Статья
  • 14 минут на чтение

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

Доступ к данным с дисков, устройств и общих сетевых ресурсов возможен с помощью файловых API-интерфейсов ввода-вывода. Файлы и каталоги, наряду с пространствами имен, являются частью концепции пути, который представляет собой строковое представление того, где можно получить данные, независимо от того, получены ли они с диска, устройства или сетевого подключения для конкретной операции.

Некоторые файловые системы, такие как NTFS, поддерживают связанные файлы и каталоги, которые также следуют соглашениям и правилам именования файлов, как и обычные файлы или каталоги. Дополнительные сведения см. в разделах «Жесткие ссылки и соединения» и «Точки повторной обработки и операции с файлами».

Для получения дополнительной информации см. следующие подразделы:

  • Имена файлов и каталогов
    • Соглашения об именах
    • Короткие и длинные имена
  • пути
    • Полностью квалифицированный и относительный пути
    • Ограничение максимальной длины пути
  • Пространства имен
    • Пространства имен файлов Win32
    • Пространства имен устройств Win32
    • Пространства имен NT
  • Похожие темы

Чтобы узнать о настройке Windows 10 для поддержки длинных путей к файлам, см. Ограничение максимальной длины пути.

Имена файлов и каталогов

Все файловые системы следуют одним и тем же общим соглашениям об именах для отдельных файлов: базовое имя файла и необязательное расширение, разделенные точкой. Однако каждая файловая система, такая как NTFS, CDFS, exFAT, UDFS, FAT и FAT32, может иметь определенные и отличающиеся правила формирования отдельных компонентов пути к каталогу или файлу. Обратите внимание, что каталог — это просто файл со специальным атрибутом, определяющим его как каталог, но в остальном он должен соответствовать всем тем же правилам именования, что и обычный файл. Поскольку термин каталог просто относится к особому типу файла, что касается файловой системы, в некоторых справочных материалах будет использоваться общий термин файл для охвата как концепций каталогов, так и файлов данных как таковых. По этой причине, если не указано иное, любые правила или примеры именования или использования файла также должны применяться к каталогу. Срок путь относится к одному или нескольким каталогам, обратной косой черте и, возможно, имени тома. Дополнительные сведения см. в разделе «Пути».

Ограничения количества символов также могут различаться и могут различаться в зависимости от файловой системы и используемого формата префикса имени пути. Это еще более усложняется поддержкой механизмов обратной совместимости. Например, более старая файловая система MS-DOS FAT поддерживает не более 8 символов для основного имени файла и 3 символа для расширения, всего 12 символов, включая разделитель точек. Это широко известно как 8.3 имя файла . Файловые системы Windows FAT и NTFS не ограничены именами файлов версии 8.3, поскольку они имеют поддержку длинных имен файлов , но они по-прежнему поддерживают версию 8.3 длинных имен файлов.

Соглашения об именах

Следующие основные правила позволяют приложениям создавать и обрабатывать допустимые имена для файлов и каталогов, независимо от файловой системы:

  • Используйте точку для отделения базового имени файла от расширения в имени каталог или файл.

  • Используйте обратную косую черту (\) для разделения компонентов пути . Обратная косая черта отделяет имя файла от пути к нему и одно имя каталога от другого имени каталога в пути. Вы не можете использовать обратную косую черту в имени фактического файла или каталога, потому что это зарезервированный символ, который разделяет имена на компоненты.

  • При необходимости используйте обратную косую черту как часть имен томов, например, «C:\» в «C:\path\file» или «\\server\share» в «\\server\share\path\ file» для имен универсального соглашения об именах (UNC). Дополнительные сведения об именах UNC см. в разделе «Ограничение максимальной длины пути».

  • Не учитывать регистр. Например, считайте имена OSCAR, Oscar и oscar одинаковыми, хотя некоторые файловые системы (например, POSIX-совместимая файловая система) могут считать их разными. Обратите внимание, что NTFS поддерживает семантику POSIX для учета регистра, но это не поведение по умолчанию. Для получения дополнительной информации см. CreateFile .

  • Обозначения томов (буквы дисков) также нечувствительны к регистру. Например, «D:\» и «d:\» относятся к одному и тому же тому.

  • Использовать любой символ текущей кодовой страницы для имени, включая символы Unicode и символы расширенного набора символов (128–255), кроме следующих:

    • Следующие зарезервированные символы:

      • < (меньше)
      • > (больше)
      • : (двоеточие)
      • «(двойная кавычка)
      • / (косая черта)
      • \ (обратная косая черта)
      • | (вертикальный стержень или труба)
      • ? (вопросительный знак)
      • * (звездочка)
    • Целое число, равное нулю, иногда называемое символом ASCII NUL .

    • Символы, целочисленные представления которых находятся в диапазоне от 1 до 31, за исключением альтернативных потоков данных, где разрешены эти символы. Дополнительные сведения о файловых потоках см. в разделе Файловые потоки.

    • Любой другой символ, который не разрешен целевой файловой системой.

  • Используйте точку в качестве каталога компонента в пути для представления текущего каталога, например «. \temp.txt». Дополнительные сведения см. в разделе Пути.

  • Используйте две последовательные точки (..) в качестве компонента каталога в пути для представления родительского каталога текущего каталога, например «..\temp.txt». Дополнительные сведения см. в разделе Пути.

  • Не используйте следующие зарезервированные имена для имени файла:

    CON, PRN, AUX, NUL, COM0, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9, LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Также избегайте этих имен, за которыми сразу следует расширение; например, NUL.txt и NUL.tar.gz эквивалентны NUL. Дополнительные сведения см. в разделе Пространства имен.

  • Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс этого не делают. Однако допустимо указывать точку в качестве первого символа имени. Например, «.temp».

Короткие и длинные имена

Длинным именем файла считается любое имя файла, которое выходит за рамки короткого стиля MS-DOS (также называемого 8.3 ). Когда вы создаете длинное имя файла, Windows также может создать короткую форму имени 8.3, называемую псевдонимом 8.3 или коротким именем, и также сохранить его на диске. Этот псевдоним 8.3 можно отключить по соображениям производительности либо для всей системы, либо для указанного тома, в зависимости от конкретной файловой системы.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: 8.3 псевдоним нельзя отключить для указанных томов до Windows 7 и Windows Server 2008 R2.

Во многих файловых системах имя файла будет содержать тильду (~) в каждом компоненте имени, что слишком длинно для соответствия правилам именования 8.3.

Примечание

Не все файловые системы следуют соглашению о замене тильды, и системы можно настроить на отключение генерации псевдонимов 8. 3, даже если они обычно поддерживают это. Поэтому не делайте предположения, что псевдоним 8.3 уже существует на диске.

 

Чтобы запросить имена файлов в формате 8.3, длинные имена файлов или полный путь к файлу из системы, рассмотрите следующие варианты:

  • Чтобы получить форму длинного имени файла в формате 8.3, используйте функцию GetShortPathName . .
  • Чтобы получить версию короткого имени с длинным именем файла, используйте функцию GetLongPathName .
  • Чтобы получить полный путь к файлу, используйте функцию GetFullPathName .

В более новых файловых системах, таких как NTFS, exFAT, UDFS и FAT32, Windows сохраняет длинные имена файлов на диске в кодировке Юникод, что означает, что всегда сохраняется исходное длинное имя файла. Это верно, даже если длинное имя файла содержит расширенные символы, независимо от кодовой страницы, которая активна во время операции чтения или записи диска.

Файлы с длинными именами файлов можно копировать между разделами файловой системы NTFS и разделами файловой системы Windows FAT без потери информации об именах файлов. Это может быть не так для более старых файловых систем MS-DOS FAT и некоторых типов файловых систем CDFS (CD-ROM), в зависимости от фактического имени файла. В этом случае по возможности заменяется короткое имя файла.

Пути

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

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

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

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

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

  • UNC-имя любого формата, которое всегда начинается с двух символов обратной косой черты («\\»). Дополнительные сведения см. в следующем разделе.
  • Обозначение диска с обратной косой чертой, например «C:\» или «d:\».
  • Одинарная обратная косая черта, например, «\directory» или «\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». Это полезно, потому что, хотя система отслеживает текущий диск вместе с текущим каталогом этого диска, она также отслеживает текущие каталоги в каждой из разных букв диска (если в вашей системе их несколько), независимо от какое обозначение диска установлено в качестве текущего диска.

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

В выпусках Windows до Windows 10 версии 1607 максимальная длина пути составляет MAX_PATH , что определяется как 260 символов. В более поздних версиях Windows для снятия ограничения требуется изменение раздела реестра или использование инструмента групповой политики. Полную информацию см. в разделе Ограничение максимальной длины пути.

Пространства имен

Существуют две основные категории соглашений о пространствах имен, используемых в API-интерфейсах Windows, обычно называемых пространства имен NT и пространства имен Win32 . Пространство имен NT было разработано как пространство имен самого низкого уровня, в котором могут существовать другие подсистемы и пространства имен, включая подсистему Win32 и, соответственно, пространства имен Win32. POSIX — еще один пример подсистемы Windows, созданной на основе пространства имен NT. Ранние версии Windows также определяли несколько предопределенных или зарезервированных имен для определенных специальных устройств, таких как коммуникационные (последовательные и параллельные) порты и консоль дисплея по умолчанию, как часть того, что сейчас называется пространством имен устройств NT, и все еще поддерживаются в текущих версиях. Windows для обратной совместимости.

Пространства имен файлов Win32

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

Для файлового ввода-вывода префикс «\\?\» к строке пути указывает API-интерфейсам Windows отключить весь синтаксический анализ строк и отправить строку, следующую за ней, прямо в файловую систему. Например, если файловая система поддерживает большие пути и имена файлов, вы можете превысить ограничения MAX_PATH , которые в противном случае применяются API-интерфейсами Windows. Дополнительные сведения об обычном ограничении максимального пути см. в предыдущем разделе Ограничение максимальной длины пути.

Поскольку он отключает автоматическое расширение строки пути, префикс «\\?\» также позволяет использовать «..» и «.» в именах путей, что может быть полезно, если вы пытаетесь выполнить операции с файлом с этими в противном случае зарезервированными спецификаторами относительного пути как части полного пути.

Многие, но не все API файлового ввода/вывода поддерживают «\\?\»; вы должны посмотреть справочную тему для каждого API, чтобы быть уверенным.

Обратите внимание, что следует использовать API-интерфейсы Unicode, чтобы убедиться, что префикс «\\?\» позволяет превысить MAX_PATH

Пространства имен устройств Win32

Префикс «\\.\» вместо этого будет обращаться к пространству имен устройств Win32 пространства имен файлов Win32. Так осуществляется доступ к физическим дискам и томам напрямую, минуя файловую систему, если API поддерживает такой тип доступа. Таким образом вы можете получить доступ ко многим устройствам, кроме дисков (используя CreateFile и DefineDosDevice функций, например).

Например, если вы хотите открыть последовательный коммуникационный порт 1 системы, вы можете использовать «COM1» в вызове функции CreateFile . Это работает, потому что COM1–COM9 являются частью зарезервированных имен в пространстве имен NT, хотя использование префикса «\\.\» также будет работать с этими именами устройств. Для сравнения, если у вас установлена ​​плата последовательного расширения на 100 портов и вы хотите открыть COM56, вы не сможете открыть ее с помощью «COM56», поскольку для COM56 нет предопределенного пространства имен NT. Вам нужно будет открыть его с помощью «\\.\COM56», потому что «\\.\» переходит непосредственно к пространству имен устройства, не пытаясь найти предопределенный псевдоним.

Еще одним примером использования пространства имен устройств Win32 является использование функции CreateFile с «\\. \PhysicalDrive X » (где X — допустимое целочисленное значение) или «\\.\CdRom X » . Это позволяет вам обращаться к этим устройствам напрямую, минуя файловую систему. Это работает, потому что эти имена устройств создаются системой по мере перечисления этих устройств, а некоторые драйверы также создают другие псевдонимы в системе. Например, драйвер устройства, реализующий имя «C:\», имеет собственное пространство имен, которое также является файловой системой.

API, которые проходят через функцию CreateFile , обычно работают с префиксом «\\.\», поскольку CreateFile — это функция, используемая для открытия как файлов, так и устройств, в зависимости от используемых вами параметров.

Если вы работаете с функциями Windows API, вы должны использовать префикс «\\.\» для доступа только к устройствам, а не к файлам.

Большинство API не поддерживают «\\.\»; только те, которые предназначены для работы с пространством имен устройства, распознают его. Всегда проверяйте справочную тему для каждого API, чтобы быть уверенным.

Пространства имен NT

Существуют также API, позволяющие использовать соглашение о пространстве имен NT, но диспетчер объектов Windows в большинстве случаев делает это ненужным. Для иллюстрации полезно просматривать пространства имен Windows в обозревателе системных объектов с помощью инструмента Windows Sysinternals WinObj. Когда вы запускаете этот инструмент, вы видите пространство имен NT, начинающееся с корня, или «\». Подпапка под названием «Global??» где находится пространство имен Win32. Объекты именованных устройств находятся в пространстве имен NT в подкаталоге «Device». Здесь вы также можете найти Serial0 и Serial1, объекты устройства, представляющие первые два COM-порта, если они есть в вашей системе. Объект устройства, представляющий том, может иметь вид HarddiskVolume1, хотя числовой индекс может отличаться. Имя «DR0» в подкаталоге «Harddisk0» является примером объекта устройства, представляющего диск, и так далее.

Чтобы сделать эти объекты устройств доступными для приложений Windows, драйверы устройств создают символическую ссылку (символическую ссылку) в пространстве имен Win32 «Global??» на соответствующие объекты устройств. Например, COM0 и COM1 в разделе «Глобальные??» subdirectory — это просто символические ссылки на Serial0 и Serial1, «C:» — это символическая ссылка на HarddiskVolume1, «Physicaldrive0» — это символическая ссылка на DR0 и так далее. Без символической ссылки указанное устройство «Xxx» не будет доступно ни одному приложению Windows, использующему соглашения о пространстве имен Win32, как описано ранее. Однако дескриптор для этого устройства можно открыть с помощью любых API, поддерживающих абсолютный путь к пространству имен NT в формате «\Device\Xxx».

С добавлением многопользовательской поддержки через службы терминалов и виртуальные машины возникла необходимость в виртуализации общесистемного корневого устройства в пространстве имен Win32. Это было достигнуто путем добавления символической ссылки с именем «GLOBALROOT» в пространство имен Win32, которое вы можете увидеть в «Global??» подкаталог инструмента браузера WinObj, который обсуждался ранее, и может получить доступ через путь «\\?\GLOBALROOT».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *