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

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

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

21
задан kvb 4 August 2010 в 15:55
поделиться

2 ответа

Maximum for MaxPath in CLR is 260 characters

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

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

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

Я предположил, что речь идет о 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. Однако это свойство является внутренним, что означает, что вы можете получить к нему доступ только через отражение и что вы не можете гарантировать, что оно будет работать в разных версиях или на других реализациях 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 вы можете снять ограничение через OptIn в реестре:

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

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

Более подробная информация находится в обновленной записи на MSDN, раздел под названием 'Maximum Path Length Limitation'.

39
ответ дан 29 November 2019 в 20:47
поделиться

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

-1
ответ дан 29 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: