Каково максимальное количество символов или длина каталога?

Какое максимальное количество символов может содержать типичный путь к каталогу при использовании C#?

Например, C:\test\ имеет длину 7 символов, какова максимальная длина?


person pedram    schedule 04.08.2010    source источник
comment
В С#? Или в конкретной операционной системе? Каждый отличается. Вам нужно уточнить свой вопрос   -  person CaffGeek    schedule 04.08.2010
comment
C# не зависит от ОС. То есть он может работать на Linux, Windows, x86, x64, мобильных устройствах и т. д. У каждого есть свое максимальное ограничение. Используйте метод, который я описал, и поймайте исключение, это, как правило, лучшее, что вы должны сделать.   -  person Abel    schedule 04.08.2010


Ответы (2)


Максимум для MaxPath в CLR — 260 символов.

Максимальное количество символов определяется MAX_PATH в библиотеке Win32 API. Этот параметр равен 260, и этот же параметр используется, жестко запрограммированный, внутри CLR BCL. Путь, достигающий такого количества символов, вероятно, вызовет проблемы (см. ниже). Это максимум для старых добрых FAT и FAT32.

И наоборот, файловая система NTFS, используемая в большинстве установок Windows по умолчанию, имеет максимум 32767 символов и поддерживает Unicode (в реализации, где каждый символ может занимать 2 байта, т. е. UCS-2, а не UTF-32). Но даже в NTFS один сегмент пути не должен превышать 255 символов. Хотя NTFS поддерживает очень длинные имена файлов, большинство приложений, включая любые приложения .NET, использующие System.IO, не смогут увидеть эти имена файлов.

Почему 260, а не 256? Поскольку спецификатор диска, первая обратная косая черта и завершающий нуль-символ не являются частью ограничений длины. Вы можете получить эту информацию для Windows, используя GetVolumeInformation< /a>, который вы должны запрашивать для каждого тома отдельно (каждый том может иметь разный максимальный размер).

Я предполагал Windows. Linux и другие ОС могут и будут отличаться. Начиная с Windows 10, сборка 1607, это ограничение снято, подробности см. ниже.


Как общий совет, вы не должны полагаться ни на одно из этих чисел. Вместо этого поймайте PathTooLongException, если вы хотите сообщить пользователям, что путь слишком длинный:

try
{
    SetCurrentDirectory(longPath);
}
catch(PathTooLongException exc)
{
    Console.WriteLine("The pathname was too long");
}

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

В стороне от .NET

Microsoft подтвердила, что проблема с текущей реализацией .NET, заключающаяся в том, что вы не можете достоверно узнать, какой максимальный размер пути поддерживается CLR. Если вы хотите получить эту информацию программно, используйте свойство Path.MaxPath. Однако свойство имеет значение internal, что означает, что вы можете получить к нему доступ только через отражение и что вы не можете гарантировать, что оно будет работать в разных версиях или в других реализациях BCL (Mono):

// reflection
FieldInfo maxPathField = typeof(Path).GetField("MaxPath", 
    BindingFlags.Static | 
    BindingFlags.GetField | 
    BindingFlags.NonPublic );

// invoke the field gettor, which returns 260
int MaxPathLength = (int) maxPathField.GetValue(null);

Примечание. Это дает вам максимальный путь, который используется реализацией Microsoft .NET. В BCL есть другое значение для максимального размера каталога, Path.MAX_DIRECTORY_PATH, но даже внутри BCL оно никогда не используется. Если вы когда-либо создадите каталог, равный этому размеру, вы не сможете поместить какие-либо файлы в этот каталог. Хуже того, простое его открытие вызовет ошибку (из-за обязательных псевдонимов полукаталогов . и .., что приводит к сбою многих API).


ОБНОВЛЕНИЕ: начиная с Windows 10 Build 1607 вы можете снять ограничение через Опция в реестре:

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

Раздел реестра позволяет включать или отключать новое поведение длинного пути. Чтобы включить поведение длинного пути, установите ключ реестра в HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (тип: REG_DWORD).

Дополнительные сведения см. в обновленная запись в MSDN, раздел под названием «Ограничение максимальной длины пути».

person Abel    schedule 04.08.2010
comment
Указанный предел — NTFS, а не Windows. Предел для FAT (который обычно используется на съемных дисках всех видов) по-прежнему составляет 260. Вот почему вы получаете его из GetVolumeInformation() - он зависит от формата и, следовательно, от объема. - person MSalters; 04.08.2010
comment
@MSalters: да, это совершенно правильно. Я обновлю, чтобы сделать мой текст более четким по этому различию. - person Abel; 04.08.2010
comment
Переписаны большие части, добавлен метод получения реального свойства MaxPath. - person Abel; 04.08.2010
comment
MAX_PATH включает ‹NUL›, представляющий невидимый завершающий нулевой символ. Таким образом, фактическая максимальная длина составляет 259, а не 260. См. msdn.microsoft.com /en-us/library/aa365247.aspx#maxpath - person Michael Freidgeim; 14.12.2016

У вас могут быть пути UNC длиннее 260, если вы добавляете к пути \\?. См. следующий раздел Именование файлов, путей и пространств имен в MSDN.

person Wil P    schedule 04.08.2010
comment
Это не работает в C#/.NET. (В настоящее время .NET вообще не позволяет использовать префикс \\?\. См. blogs.msdn.com/b/bclteam/archive/2008/07/07/< /а>) - person Mark Meuer; 13.07.2011