Как сокращать пути windows

Содержание
  1. Как сокращать пути windows
  2. Описание проблемы длинных путей
  3. Методы снимающие ограничения на длину пути в Windows
  4. Нюансы длинных путей в приложениях
  5. Как в Windows 10 отключить ограничение на длину пути в 260 символов через политику
  6. Включение поддержки длинных путей через реестр
  7. Как в Windows 10 отключить ограничение на длину пути в 260 символов через PowerShell
  8. Как удалять, копировать, переносить файлы и папки при ошибке с длинными путями
  9. Как в Windows 10 отключить ограничение на длину пути в 260 символов через командную строку
  10. Обход ограничений длинных путей через 7zFM
  11. Как обойти ограничение длинных путей через символьную ссылку
  12. Слишком длинный путь к источнику
  13. Описание
  14. Причина
  15. Решение
  16. Способ 1. Уменьшаем путь до файла
  17. Способ 2. Включаем поддержку длинных файлов
  18. Способ 3. Far Manager
  19. Способ 4. Укорачиваем сетевой путь
  20. Способ 5. Используем командную строку
  21. В чем была проблема?
  22. Форматы путей к файлам в системах Windows File path formats on Windows systems
  23. Традиционные пути DOS Traditional DOS paths
  24. UNC-пути UNC paths
  25. Пути к устройствам DOS DOS device paths
  26. Пример. Способы задать ссылку на один и тот же файл Example: Ways to refer to the same file
  27. Нормализация путей Path normalization
  28. Идентификация пути Identify the path
  29. Работа с устаревшими устройствами Handle legacy devices
  30. Применение текущего каталога Apply the current directory
  31. Канонизация разделителей Canonicalize separators
  32. Вычисление относительных компонентов Evaluate relative components
  33. Удаление знаков Trim characters
  34. Пропуск нормализации Skip normalization
  35. Регистр символов и файловая система Windows Case and the Windows file system

Как сокращать пути windows

Добрый день! Уважаемые читатели и гости одного из крупнейших 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, указывая абсолютный путь с префиксом \\?\, например так:

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

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

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

Методы снимающие ограничения на длину пути в 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, в манифесте обязательно указывайте следующие настройки:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Путь где будет лежать файл символической ссылки — в моем примере C:\короткий путь
  • Длинный путь — C:\Share\WINDOW

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

Слишком длинный путь к источнику

Описание

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

Слишком длинный путь к источнику.
Файловая система не поддерживает такие длинные имена исходных файлов. Попробуйте перенести файл в папку с меньшей длинной пути или укажите более короткое имя файла и повторите попытку.

Причина

По умолчанию, операционная система Windows настроена на блокирование действий над файлами в проводнике, путь к которым более 255 символов.

Решение

Способ 1. Уменьшаем путь до файла

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

1. Переименовываем все папки, в которые вложен наш файл, на менее длинные названия. Когда путь сократится, можно выполнить удаление или перемещение.

2. Создаем символьную ссылку на конечный путь. Это можно сделать командой:

mklink /d «C:\Папка0» «C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5»

* в данном примере перейдя по пути C:\Папка0, мы окажемся в папке C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5.

3. Сопоставляем папку букве диска с помощью команды subst:

subst S: «C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5»

* в данном примере мы создадим диск S, который будет вести нас в папку C:\Папка\Папка 2\Папка 3\ Папка 4\Папка 5.

Способ 2. Включаем поддержку длинных файлов

Данный способ поддерживается, начиная с Windows 10 / Server 2016.

Ограничение в 255 символов — пережиток прошлого, необходимый для обеспечения совместимости с другими файловыми системами. Система не будет работать хуже, если данное ограничение отключить.

Открываем реестр (команда regedit) и переходим по пути HKLM\SYSTEM\CurrentControlSet\Control\FileSystem. Находим или создаем ключ LongPathsEnabled с типом REG_DWORD и задаем ему значение 1.

Это же действие из командной строки:

reg delete «HKLM\SYSTEM\CurrentControlSet\Control\FileSystem» /v LongPathsEnabled /f

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

* первая команда, на всякий случай, удалит старый параметр (если его нет, команда вернет ошибку). Вторая — создаст нужный нам ключ.

Способ 3. Far Manager

Устанавливаем программу Far Manager — переходим в нужный каталог и выполняем нужные действия над файлами.

Иногда, данный способ работает только после того, как мы включили поддержку длинных имен (способ 2).

Способ 4. Укорачиваем сетевой путь

Настраиваем сетевой доступ к папке и подключаем ее как сетевой диск. Путь станет меньше.

Например, это можно сделать командой:

net use J: \\server\share /persistent:yes

* данной командой мы создадим диск J, который будет вести на сетевую папку \\server\share.

Способ 5. Используем командную строку

Если нам нужно скопировать или перенести небольшое количество файлов, мы можем воспользоваться командной строкой. Для копирования используем xcopy, для переноса — move.

В чем была проблема?

Если вам удалось решить проблему, поделитесь своим опытом для других. Что помогло:

Форматы путей к файлам в системах Windows File path formats on Windows systems

Члены большинства типов в пространстве имен System.IO имеют параметр path , который позволяет указать абсолютный или относительный путь к ресурсу в файловой системе. Members of many of the types in the System.IO namespace include a path parameter that lets you specify an absolute or relative path to a file system resource. Этот путь передается в API файловой системы Windows. This path is then passed to Windows file system APIs. В этом разделе рассматриваются форматы путей к файлам, которые можно использовать в операционных системах Windows. This topic discusses the formats for file paths that you can use on Windows systems.

Традиционные пути DOS Traditional DOS paths

Стандартный путь DOS может состоять из трех компонентов: A standard DOS path can consist of three components:

  • Буква тома или диска, после которой следует разделитель томов ( : ). A volume or drive letter followed by the volume separator ( : ).
  • Имя каталога. A directory name. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога. The directory separator character separates subdirectories within the nested directory hierarchy.
  • Необязательное имя файла. An optional filename. Символ разделителя каталогов служит для разделения пути к файлу и его имени. The directory separator character separates the file path and the filename.

Если присутствуют все три компонента, путь является абсолютным. If all three components are present, the path is absolute. Если буква тома или диска не указана и имя каталога начинается с символа разделителя каталогов, такой путь задан относительно корня текущего диска. If no volume or drive letter is specified and the directory name begins with the directory separator character, the path is relative from the root of the current drive. В противном случае путь задан относительно текущего каталога. Otherwise, the path is relative to the current directory. В следующей таблице показаны некоторые возможные пути к каталогам и файлам. The following table shows some possible directory and file paths.

Путь Path Описание: Description
C:\Documents\Newsletters\Summer2018.pdf Абсолютный путь к файлу из корня диска C: . An absolute file path from the root of drive C: .
\Program Files\Custom Utilities\StringFinder.exe Абсолютный путь из корня текущего диска. An absolute path from the root of the current drive.
2018\January.xlsx Относительный путь к файлу в подкаталоге текущего каталога. A relative path to a file in a subdirectory of the current directory.
..\Publications\TravelBrochure.pdf Относительный путь к файлу в каталоге, который является одноранговым для текущего каталога. A relative path to file in a directory that is a peer of the current directory.
C:\Projects\apilibrary\apilibrary.sln Абсолютный путь к файлу из корня диска C: . An absolute path to a file from the root of drive C: .
C:Projects\apilibrary\apilibrary.sln Относительный путь из текущего каталога диска C: . A relative path from the current directory of the C: drive.

Обратите внимание на различия между двумя последними путями. Note the difference between the last two paths. В обоих случаях задается необязательный описатель тома ( C: ), однако первый путь, в отличие от второго, начинается с корня указанного тома. Both specify the optional volume specifier ( C: in both cases), but the first begins with the root of the specified volume, whereas the second does not. В результате первый путь является абсолютным из корневого каталога диска C: , тогда как второй — относительным из текущего каталога C: . As result, the first is an absolute path from the root directory of drive C: , whereas the second is a relative path from the current directory of drive C: . Использование второй формы пути в тех случаях, когда предполагается наличие первой, является распространенным источником ошибок, связанных с путями к файлам в Windows. Use of the second form when the first is intended is a common source of bugs that involve Windows file paths.

Чтобы определить, является ли путь к файлу полным (такой путь не зависит от текущего каталога и не изменяется при смене текущего каталога), можно вызвать метод Path.IsPathFullyQualified. You can determine whether a file path is fully qualified (that is, it the path is independent of the current directory and does not change when the current directory changes) by calling the Path.IsPathFullyQualified method. Обратите внимание, что такой путь может включать сегменты с относительным путем к каталогу ( . и .. ), но при этом по-прежнему будет полным, если разрешенный путь всегда указывает на одно и то же место. Note that such a path can include relative directory segments ( . and .. ) and still be fully qualified if the resolved path always points to the same location.

В приведенном ниже примере показано различие между абсолютными и относительными путями. The following example illustrates the difference between absolute and relative paths. Предполагается, что каталог D:\FY2018\ существует и вы не установили какой-либо текущий каталог для диска D:\ из командной строки перед запуском этого примера. It assumes that the directory D:\FY2018\ exists, and that you haven’t set any current directory for D:\ from the command prompt before running the example.

Если вы хотите увидеть комментарии к коду, переведенные на языки, отличные от английского, сообщите нам на странице обсуждения этой проблемы на сайте GitHub. If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

UNC-пути UNC paths

UNC-пути (универсальное соглашение об именовании) используются для доступа к сетевым ресурсам и имеют следующий формат: Universal naming convention (UNC) paths, which are used to access network resources, have the following format:

  • Имя сервера или узла, которому предшествуют символы \\ . A server or host name, which is prefaced by \\ . В качестве имени сервера может выступать имя компьютера NetBIOS, а также IP-адрес или полное доменное имя (поддерживаются адреса IPv4 и IPv6). The server name can be a NetBIOS machine name or an IP/FQDN address (IPv4 as well as v6 are supported).
  • Имя общего ресурса, которое отделяется от имени узла символами \ . A share name, which is separated from the host name by \ . Имя сервера и имя общего ресурса в совокупности образуют том. Together, the server and share name make up the volume.
  • Имя каталога. A directory name. Символ разделителя каталогов служит для разделения подкаталогов во внутренней иерархии каталога. The directory separator character separates subdirectories within the nested directory hierarchy.
  • Необязательное имя файла. An optional filename. Символ разделителя каталогов служит для разделения пути к файлу и его имени. The directory separator character separates the file path and the filename.

Ниже приводятся некоторые примеры UNC-путей: The following are some examples of UNC paths:

Path Path Описание Description
\\system07\C$\ Корневой каталог диска C: на компьютере system07 . The root directory of the C: drive on system07 .
\\Server2\Share\Test\Foo.txt Файл Foo.txt в тестовом каталоге тома \\Server2\Share . The Foo.txt file in the Test directory of the \\Server2\Share volume.

UNC-пути всегда должны быть полными. UNC paths must always be fully qualified. Они могут включать сегменты с относительным путем к каталогу ( . и .. ), однако они должны быть частью полного пути. They can include relative directory segments ( . and .. ), but these must be part of a fully qualified path. Использовать относительные пути можно только посредством сопоставления UNC-пути с буквой диска. You can use relative paths only by mapping a UNC path to a drive letter.

Пути к устройствам DOS DOS device paths

В операционной системе Windows используется унифицированная объектная модель, которая указывает на все ресурсы, включая файлы. The Windows operating system has a unified object model that points to all resources, including files. Эти пути к объектам доступны из окна консоли и предоставляются на уровень Win32 с использованием специальной папки с символьными ссылками, с которыми сопоставляются устаревшие пути DOS и UNC. These object paths are accessible from the console window and are exposed to the Win32 layer through a special folder of symbolic links that legacy DOS and UNC paths are mapped to. Доступ к этой специальной папке осуществляется с использованием синтаксиса пути к устройству DOS, который может иметь одну из приведенных ниже форм: This special folder is accessed via the DOS device path syntax, which is one of:

Помимо использования буквы диска, вы можете указать том с помощью его GUID. In addition to identifying a drive by its drive letter, you can identify a volume by using its volume GUID. Синтаксис будет иметь вид: This takes the form:

Синтаксис пути к устройству DOS поддерживается в реализациях платформы .NET для ОС Windows, начиная с версий .NET Core 1.1 и .NET Framework 4.6.2. DOS device path syntax is supported on .NET implementations running on Windows starting with .NET Core 1.1 and .NET Framework 4.6.2.

Путь к устройству DOS состоит из следующих компонентов: The DOS device path consists of the following components:

Описатель пути к устройству ( \\.\ или \\?\ ), который идентифицирует путь как путь к устройству DOS. The device path specifier ( \\.\ or \\?\ ), which identifies the path as a DOS device path.

Описатель \\?\ поддерживается во всех версиях .NET Core, в .NET 5 и более поздних версий, а также в .NET Framework, начиная с версии 4.6.2. The \\?\ is supported in all versions of .NET Core and .NET 5+ and in .NET Framework starting with version 4.6.2.

Символьная ссылка на «реальный» объект устройства (C: в случае имени диска или Volume в случае GUID тома). A symbolic link to the «real» device object (C: in the case of a drive name, or Volume in the case of a volume GUID).

Первый сегмент пути к устройству DOS после описателя пути к устройству идентифицирует том или диск. The first segment of the DOS device path after the device path specifier identifies the volume or drive. (Например, \\?\C:\ и \\.\BootPartition\ .) (For example, \\?\C:\ and \\.\BootPartition\ .)

Для UNC-путей существует специальная ссылка, которая называется UNC . There is a specific link for UNCs that is called, not surprisingly, UNC . Пример: For example:

Для UNC-путей к устройствам часть сервера или общего сетевого ресурса образует том. For device UNCs, the server/share portion forms the volume. Например, в пути \\?\server1\e:\utilities\\filecomparer\ часть server1\utilities представляет сервер или общий сетевой ресурс. For example, in \\?\server1\e:\utilities\\filecomparer\ , the server/share portion is server1\utilities . Это важно при вызове такого метода, как Path.GetFullPath(String, String) с сегментами с относительным путем к каталогу, поскольку переход дальше тома невозможен. This is significant when calling a method such as Path.GetFullPath(String, String) with relative directory segments; it is never possible to navigate past the volume.

Пути к устройствами DOS по определению являются полными. DOS device paths are fully qualified by definition. Сегменты с относительным путем к каталогу ( . и .. ) в них не допускаются. Relative directory segments ( . and .. ) are not allowed. Они никогда не задаются относительно текущего каталога. Current directories never enter into their usage.

Пример. Способы задать ссылку на один и тот же файл Example: Ways to refer to the same file

В следующем примере демонстрируются некоторые способы задать ссылку на файл с использованием API в пространстве имен System.IO. The following example illustrates some of the ways in which you can refer to a file when using the APIs in the System.IO namespace. В этом примере создается экземпляр объекта FileInfo и используются его свойства Name и Length, чтобы отобразить имя и длину файла. The example instantiates a FileInfo object and uses its Name and Length properties to display the filename and the length of the file.

Нормализация путей Path normalization

Практически все передаваемые в API Windows пути нормализуются. Almost all paths passed to Windows APIs are normalized. При нормализации в Windows выполняются следующие действия: During normalization, Windows performs the following steps:

  • Идентифицируется путь. Identifies the path.
  • Текущий каталог применяется к неполным (относительным) путям. Applies the current directory to partially qualified (relative) paths.
  • Выполняется канонизация разделителей каталогов. Canonicalizes component and directory separators.
  • Вычисляются относительные компоненты каталога ( . для текущего и .. для родительского каталога). Evaluates relative directory components ( . for the current directory and .. for the parent directory).
  • Удаляются некоторые символы. Trims certain characters.

Нормализация осуществляется неявно, но при необходимости вы можете выполнить ее явно, вызвав метод Path.GetFullPath, который создает оболочку для вызова функции GetFullPathName(). This normalization happens implicitly, but you can do it explicitly by calling the Path.GetFullPath method, which wraps a call to the GetFullPathName() function. Также можно вызвать функцию GetFullPathName() Windows напрямую с помощью P/Invoke. You can also call the Windows GetFullPathName() function directly using P/Invoke.

Идентификация пути Identify the path

На первом шаге процесса нормализации осуществляется идентификация типа пути. The first step in path normalization is identifying the type of path. Пути могут относиться к одной из нескольких категорий: Paths fall into one of a few categories:

  • Пути к устройствам: начинаются с двух разделителей и знака вопроса или точки ( \\? или \\. ). They are device paths; that is, they begin with two separators and a question mark or period ( \\? or \\. ).
  • UNC-пути: начинаются с двух разделителей без знака вопроса или точки. They are UNC paths; that is, they begin with two separators without a question mark or period.
  • Полные пути DOS: начинаются с буквы диска, разделителя томов и компонентов ( C:\ ). They are fully qualified DOS paths; that is, they begin with a drive letter, a volume separator, and a component separator ( C:\ ).
  • Пути к устаревшим устройствам ( CON , LPT1 ). They designate a legacy device ( CON , LPT1 ).
  • Пути относительно корня текущего диска: начинаются с одного разделителя компонентов ( \ ). They are relative to the root of the current drive; that is, they begin with a single component separator ( \ ).
  • Пути относительно текущего каталога указанного диска: начинаются с буквы диска и разделителя томов, но не содержат разделителя компонентов ( C: ). They are relative to the current directory of a specified drive; that is, they begin with a drive letter, a volume separator, and no component separator ( C: ).
  • Пути относительно текущего каталога: начинаются с любых других символов ( temp\testfile.txt ). They are relative to the current directory; that is, they begin with anything else ( temp\testfile.txt ).

Тип пути определяет, будет ли каким-либо образом применяться текущий каталог. The type of the path determines whether or not a current directory is applied in some way. Кроме того, от типа пути зависит применяемый корень. It also determines what the «root» of the path is.

Работа с устаревшими устройствами Handle legacy devices

Если путь указывает на устаревшее устройство DOS, например CON , COM1 или LPT1 , он преобразуется в путь к устройству путем добавления перед ним последовательности \\.\ и возвращается в таком виде. If the path is a legacy DOS device such as CON , COM1 , or LPT1 , it is converted into a device path by prepending \\.\ and returned.

Путь, который начинается с имени устаревшего устройства, всегда интерпретируется как путь к устаревшему устройству с помощью метода Path.GetFullPath(String). A path that begins with a legacy device name is always interpreted as a legacy device by the Path.GetFullPath(String) method. Например, путь к устройству DOS CON.TXT будет выглядеть как \\.\CON , а путь к устройству DOS COM1.TXT\file1.txt будет выглядеть как \\.\COM1 . For example, the DOS device path for CON.TXT is \\.\CON , and the DOS device path for COM1.TXT\file1.txt is \\.\COM1 .

Применение текущего каталога Apply the current directory

Если путь не является полным, система Windows применяет к нему текущий каталог. If a path isn’t fully qualified, Windows applies the current directory to it. К UNC-путям и путям к устройствам текущий каталог не применяется. UNCs and device paths do not have the current directory applied. Также текущий каталог не применяется к полным путям к диску с разделителем C:\ . Neither does a full drive with separator C:\ .

Если путь начинается с одного разделителя компонентов, применяется диск текущего каталога. If the path starts with a single component separator, the drive from the current directory is applied. Например, для пути к файлу \utilities и текущего каталога C:\temp\ в результате нормализации будет получен путь C:\utilities . For example, if the file path is \utilities and the current directory is C:\temp\ , normalization produces C:\utilities .

Если путь начинается с буквы диска, разделителя томов и не содержит разделителя компонентов, применяется последний текущий каталог, установленный из командной оболочки. If the path starts with a drive letter, volume separator, and no component separator, the last current directory set from the command shell for the specified drive is applied. Если последний текущий каталог не был установлен, применяется диск сам по себе. If the last current directory was not set, the drive alone is applied. Например, для пути D:sources , текущего каталога C:\Documents\ и последнего текущего каталога D:\sources\ на диске D: в результате будет получен путь D:\sources\sources . For example, if the file path is D:sources , the current directory is C:\Documents\ , and the last current directory on drive D: was D:\sources\ , the result is D:\sources\sources . Пути, задаваемые относительно диска, являются распространенными источниками ошибок программ и логики скрипта. These «drive relative» paths are a common source of program and script logic errors. Предположение, что путь, начинающийся с буквы и двоеточия, не является относительным, очевидно неверно. Assuming that a path beginning with a letter and a colon isn’t relative is obviously not correct.

Если путь не начинается с разделителя, применяются текущий диск и текущий каталог. If the path starts with something other than a separator, the current drive and current directory are applied. Например, для пути к файлу filecompare и текущего каталога C:\utilities\ в результате будет получен путь C:\utilities\filecompare\ . For example, if the path is filecompare and the current directory is C:\utilities\ , the result is C:\utilities\filecompare\ .

Применение относительных путей в многопотоковых приложениях (то есть в большинстве приложений) сопряжено с определенными рисками, поскольку текущий каталог задается на уровне процесса. Relative paths are dangerous in multithreaded applications (that is, most applications) because the current directory is a per-process setting. Таким образом, любой поток может в любое время изменить текущий каталог. Any thread can change the current directory at any time. Начиная с версии .NET Core 2.1, вы можете вызвать метод Path.GetFullPath(String, String) для получения абсолютного пути на основе относительного и базового (текущий каталог) путей, относительно которых требуется выполнить разрешение. Starting with .NET Core 2.1, you can call the Path.GetFullPath(String, String) method to get an absolute path from a relative path and the base path (the current directory) that you want to resolve it against.

Канонизация разделителей Canonicalize separators

Все символы косой черты ( / ) преобразуются в стандартные разделители Windows, то есть символы обратной косой черты ( \ ). All forward slashes ( / ) are converted into the standard Windows separator, the back slash ( \ ). Если они присутствуют, последовательность символов косой черты после первых двух таких символов свертывается в один символ косой черты. If they are present, a series of slashes that follow the first two slashes are collapsed into a single slash.

Вычисление относительных компонентов Evaluate relative components

При обработке пути выполняется вычисление любых его компонентов или сегментов, которые состоят из одной или двух точек ( . или .. ): As the path is processed, any components or segments that are composed of a single or a double period ( . or .. ) are evaluated:

Если обнаруживается одна точка, текущий сегмент удаляется, поскольку он ссылается на текущий каталог. For a single period, the current segment is removed, since it refers to the current directory.

Если обнаруживаются две точки, удаляются текущий и родительский сегмент, поскольку в этом случае задается ссылка на родительский каталог. For a double period, the current segment and the parent segment are removed, since the double period refers to the parent directory.

Родительские каталоги удаляются только в том случае, если они не находятся после корня пути. Parent directories are only removed if they aren’t past the root of the path. Корень пути зависит от его типа. The root of the path depends on the type of path. Это будет диск ( C:\ ) для путей DOS, сервер или общий сетевой ресурс для UNC-путей ( \\Server\Share ) и префикс пути к устройству для путей к устройствам ( \\?\ или \\.\ ). It is the drive ( C:\ ) for DOS paths, the server/share for UNCs ( \\Server\Share ), and the device path prefix for device paths ( \\?\ or \\.\ ).

Удаление знаков Trim characters

Помимо удаленных ранее разделителей и относительных сегментов во время нормализации также удаляются некоторые дополнительные знаки: Along with the runs of separators and relative segments removed earlier, some additional characters are removed during normalization:

Если сегмент заканчивается одной точкой, эта точка удаляется. If a segment ends in a single period, that period is removed. (Сегмент, состоящий из одной или двух точек, нормализуется на предыдущем шаге. (A segment of a single or double period is normalized in the previous step. Сегмент, состоящий из трех или более точек, не нормализуется и фактически представляет собой допустимое имя файла или каталога.) A segment of three or more periods is not normalized and is actually a valid file/directory name.)

Если путь не заканчивается разделителем, удаляются все конечные точки и пробелы (U+0020). If the path doesn’t end in a separator, all trailing periods and spaces (U+0020) are removed. Если последний сегмент содержит только одну или две точки, к нему применяется приведенное выше правило для относительных компонентов. If the last segment is simply a single or double period, it falls under the relative components rule above.

Это правило устанавливает, что вы можете создать имя каталога с конечным пробелом, добавив разделитель после пробела. This rule means that you can create a directory name with a trailing space by adding a trailing separator after the space.

Создавать имена каталогов или файлов с конечным пробелом нельзя. You should never create a directory or filename with a trailing space. Наличие конечных пробелов может затруднить или исключить возможность доступа к каталогу. В связи с этим при попытке обработать каталоги или файлы, имена которых содержат конечные пробелы, происходит сбой приложения. Trailing spaces can make it difficult or impossible to access a directory, and applications commonly fail when attempting to handle directories or files whose names include trailing spaces.

Пропуск нормализации Skip normalization

Как правило, любой путь, передаваемый в API Windows передается в функцию GetFullPathName и нормализуется. Normally, any path passed to a Windows API is (effectively) passed to the GetFullPathName function and normalized. Существует одно важное исключение: путь к устройству, который начинается со знака вопроса, а не с точки. There is one important exception: a device path that begins with a question mark instead of a period. Если путь не начинается с последовательности \\?\ (обратите внимание на использование канонической формы с обратной косой чертой), он нормализуется. Unless the path starts exactly with \\?\ (note the use of the canonical backslash), it is normalized.

Зачем нужно пропускать нормализацию? Why would you want to skip normalization? Существует три основных причины: There are three major reasons:

Получение путей, которые в обычных обстоятельствах недоступны, но являются допустимыми. To get access to paths that are normally unavailable but are legal. Например, невозможно каким-либо иным способом получить доступ к файлу или каталогу с именем hidden. . A file or directory called hidden. , for example, is impossible to access in any other way.

Повышение производительности за счет пропуска нормализации в тех случаях, когда нормализация уже выполнена. To improve performance by skipping normalization if you’ve already normalized.

Только на платформе .NET Framework пропуск проверки длины пути MAX_PATH для использования путей длиной более 259 символов. On .NET Framework only, to skip the MAX_PATH check for path length to allow for paths that are greater than 259 characters. Такое поведение допускается в большинстве API за некоторыми исключениями. Most APIs allow this, with some exceptions.

.NET Core и .NET 5 или более поздней версии обрабатывают длинные пути неявным образом и не выполняют проверку MAX_PATH . .NET Core and .NET 5+ handles long paths implicitly and does not perform a MAX_PATH check. Проверка MAX_PATH применяется только для платформы .NET Framework. The MAX_PATH check applies only to .NET Framework.

Пропуск нормализации и проверки максимальной длины пути является единственным отличием между двумя видами синтаксиса путей к устройствам. В остальных аспектах они идентичны. Skipping normalization and max path checks is the only difference between the two device path syntaxes; they are otherwise identical. Пропуск нормализации следует использовать с осторожностью, поскольку в этом случае легко получить пути, при работе с которыми в обычных приложениях будут возникать трудности. Be careful with skipping normalization, since you can easily create paths that are difficult for «normal» applications to deal with.

Пути, начинающиеся с последовательности \\?\ , по-прежнему нормализуются, если явно передать их в функцию GetFullPathName. Paths that start with \\?\ are still normalized if you explicitly pass them to the GetFullPathName function.

Вы можете передавать пути длиной более MAX_PATH символов в функцию GetFullPathName без \\?\ . You can pass paths of more than MAX_PATH characters to GetFullPathName without \\?\ . Она поддерживает пути произвольной длины, которая ограничивается лишь максимальным размером строки, поддерживаемым в Windows. It supports arbitrary length paths up to the maximum string size that Windows can handle.

Регистр символов и файловая система Windows Case and the Windows file system

Особенность файловой системы Windows заключается в том, что пользователи и разработчики, имеющие дело с другими операционными системами, могут сталкиваться с проблемами из-за того, что в именах каталогов и путях не учитывается регистр символов. A peculiarity of the Windows file system that non-Windows users and developers find confusing is that path and directory names are case-insensitive. Это значит, что в именах каталогов и файлов сохраняется регистр строк, используемый в момент их создания. That is, directory and file names reflect the casing of the strings used when they are created. Например, вызов метода For example, the method call

Читайте также:  Как выделить строку всю строку mac os
Оцените статью