Максимум для MaxPath в CLR составляет 260 символов
Максимальное количество символов определяется 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
. Однако свойство имеет значение 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 вы можете удалить ограничение через OptIn в реестре:
Начиная с Windows 10, версия 1607, ограничения MAX_PATH имеют
был удален из общих функций файлов и каталогов Win32. Тем не мение,
Вы должны подписаться на новое поведение.
Раздел реестра позволяет вам
включить или отключить новое поведение длинного пути. Чтобы включить длинный путь
Поведение установить ключ реестра в
HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled
(Введите: REG_DWORD).
Дополнительная информация содержится в обновленной записи в MSDN , раздел под названием «Ограничение максимальной длины пути».