Какое максимальное количество символов имеет расширение имени файла

Обновлено: 04.07.2024

Я разрабатываю таблицу базы данных, в которой будут храниться имена загруженных файлов. Какова максимальная длина имени файла в NTFS, используемой в Windows XP или Vista?

Я никогда не видел столько разных ответов на, казалось бы, простой вопрос. 199, 255, 256, 257, 260, «около 30 000», «примерно 32 000» и «это зависит». Конечно, есть квалификаторы, но не могут же они все быть правильными, не так ли?

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

@РобертПитт. Вы что-то там упускаете. Цитата из MSDN: «максимальная длина пути MAX_PATH, которая определяется как 260 символов»

@Майкл9000. Я полагаю, что РобертПитт цитировал ограничение имени файла (о чем этот вопрос), а не ограничение пути.

NTFS вообще НЕ ограничена MAX_PATH, Windows Shell ограничена MAX_PATH, максимальная длина пути NTFS составляет 32 КБ

14 ответов 14

Отдельные компоненты имени файла (т. е. каждый подкаталог на пути и конечное имя файла) ограничены 255 символами, а общая длина пути ограничена примерно 32 000 символами.

Верно для NTFS, неверно для Windows, согласно предоставленной вами ссылке: "В Windows API (за некоторыми исключениями, обсуждаемыми в следующих абзацах) максимальная длина пути составляет MAX_PATH, которая определяется как 260 символов. ". Длина общего пути для всех практических целей ограничена 259 символами (с учетом завершающего нуля).

Очевидно, что если вы используете "юникодную версию" файловых методов Windows API, вы можете получить до 32767, если добавите к путям префикс "\\?\", верно?

@rogerdpack: для полного пути — да, но каждый отдельный компонент (подпапка/конечный файл) имеет ограничение в 255 кодовых точек utf-16. Плюс обычное ПО ожидает MAX_PATH, т.е. бум :)

В Windows 10 (версия 1607 — Anniversary Update) и Windows Server 2016 у вас есть возможность игнорировать проблему MAX_PATH, переопределяя запись групповой политики, включающую длинные пути NTFS в разделе «Конфигурация компьютера» -> «Шаблоны администрирования» -> «Система» -> Файловая система:

Это 257 символов. Чтобы быть точным: сама NTFS устанавливает максимальную длину имени файла в несколько тысяч символов (около 30 000 с чем-то). Тем не менее, Windows устанавливает максимальную длину 260 для пути + имени файла. Диск+папка занимает как минимум 3 символа, поэтому в итоге получится 257.

Неверно: терминатор NUL является частью MAX_PATH, что оставляет вам максимальный путь из 256 символов (который вы не сможете создать из-за ограничения отдельных компонентов в 255).

"которое вы не сможете создать из-за ограничения количества отдельных компонентов в 255" Неверно. Мы говорим здесь о максимальной длине пути, а не о максимальной длине отдельных компонентов пути. Более того, «при использовании API для создания каталога указанный путь не может быть настолько длинным, чтобы вы не могли добавить имя файла 8.3 (то есть имя каталога не может превышать MAX_PATH минус 12)».

Эти споры возникают только потому, что низкоуровневый API позволяет создавать имена файлов из 256 символов, при условии, что 256 символов являются нулевыми, но файл становится недоступным (скрытым) для собственных приложений, поэтому обычно бесполезен.

@LudovicKuty: на самом деле ОП говорил об ограничении длины имени файла, а не о длине пути (да, я проверял даже в исходной версии). И он/она очень конкретно имел в виду ограничения NTFS, а не ограничения ОС, конкретной подсистемы, API или фреймворка.

@0xC0000022L Да, действительно. Я неправильно понял это в вопросе OP и сосредоточился на комментариях, в которых говорится о длине имени файла и длине пути.

Вот что говорит «Необработанное исключение» в фреймворке 4.5 при попытке сохранить файл с длинным именем:

Указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть меньше 260 символов, а имя каталога должно быть меньше 248 символов.

screenshot

199 в Windows XP NTFS, только что проверил.

Это не теория, а просто примерка на моем ноутбуке. Могут быть смягчающие эффекты, но физически это не позволит мне увеличить его.

Интересно, есть ли какие-то другие настройки, ограничивающие это? Попробуйте сами.

Кажется, ограничение в 200 символов есть в проводнике. Другие программы могут создавать более длинные имена файлов. Вероятно, это намеренное ограничение, чтобы уберечь пользователя от самого себя. :-)

Нет, вы (непреднамеренно) проверили ограничение MAX_PATH, равное 260 (259 без завершающего нулевого символа). Попробуйте еще раз, указав C:\ в качестве текущего каталога.

@Проф.Falken У меня больше нет XP для проверки, и я поверю вам на слово, может быть, вместо этого вы предпочтете хорошую игру в крестики-нолики?

Длина в NTFS – 255. Поле NameLength в атрибуте NTFS $Filename представляет собой байт без смещения; это дает диапазон от 0 до 255.

Таким образом, имя файла или каталога может содержать до 255 символов. При указании полного пути под Windows необходимо указать префикс пути \\?\ (или использовать \\?\UNC\server\share для путей UNC), чтобы пометить этот путь как путь расширенной длины (~32 тыс. символов) . Если ваш путь длиннее, вам придется установить свой рабочий каталог по пути (тьфу - побочные эффекты из-за настройки всего процесса).

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

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

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

Дополнительную информацию см. в следующих подразделах:

Чтобы узнать, как настроить 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), за исключением следующих:

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

  • (больше)
  • : (двоеточие)
  • " (двойные кавычки)
  • / (косая черта)
  • \ (обратная косая черта)
  • | (вертикальная полоса или труба)
  • <ли>? (вопросительный знак)
  • * (звездочка)

Целое значение, равное нулю, иногда называемое символом NUL ASCII.

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

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

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

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

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

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

Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка 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), в зависимости от фактического имени файла. В этом случае по возможности заменяется короткое имя файла.

Пути

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

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

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

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

Для функций 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 для снятия ограничения требуется изменение раздела реестра или использование инструмента групповой политики. Полную информацию см. в разделе Ограничение максимальной длины пути.

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

Существует две основные категории соглашений о пространствах имен, используемых в Windows API, обычно называемых пространствами имен 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 с "\\.\PhysicalDiskX" (где X – допустимое целочисленное значение) или " \\.\CdRomX". Это позволяет вам обращаться к этим устройствам напрямую, минуя файловую систему. Это работает, потому что эти имена устройств создаются системой по мере перечисления этих устройств, а некоторые драйверы также создают другие псевдонимы в системе. Например, драйвер устройства, реализующий имя "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 в разделе "Глобальные??" подкаталог — это просто символическая ссылка на Serial0 и Serial1, «C:» — это символическая ссылка на HarddiskVolume1, «Physicaldrive0» — это символическая ссылка на DR0 и так далее. Без символической ссылки указанное устройство «Xxx» не будет доступно ни одному приложению Windows, использующему соглашения о пространстве имен Win32, как описано ранее. Однако дескриптор этого устройства может быть открыт с помощью любых API, поддерживающих абсолютный путь пространства имен NT в формате "\Device\Xxx".

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

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

Например, вы можете столкнуться с этим ограничением, если клонируете репозиторий git с длинными именами файлов в папку с длинным именем.

Функции файлового ввода-вывода в Windows API преобразуют «/» в «\» как часть преобразования имени в имя в стиле NT, за исключением случаев использования префикса «\\?\», как подробно описано в следующих разделах. .

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

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

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

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

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

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

Включить длинные пути в Windows 10 версии 1607 и более поздних

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

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

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

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

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

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

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

Это функции управления файлами, которые больше не имеют ограничений MAX_PATH, если вы согласились на использование длинного пути: CopyFileW, CopyFile2, CopyFileExW, CreateFileW, CreateFile2, CreateHardLinkW, CreateSymbolicLinkW, DeleteFileW, FindFirstFileW, FindFirstFileExW, FindNextFileW, GetFileAttributesW, GetFileAttributesExW , SetFileAttributesW, GetFullPathNameW, GetLongPathNameW, MoveFileW, MoveFileExW, MoveFileWithProgressW, ReplaceFileW, SearchPathW, FindFirstFileNameW, FindNextFileNameW, FindFirstStreamW, FindNextStreamW, GetCompressedFileSizeW, GetFinalPathNameByHandleW.

Найдите свой тарифный план в консоли Code42 в меню "Учетная запись" .
Не клиент Incydr? Чтобы найти статьи CrashPlan, выполните поиск или просмотрите .

Incydr Professional, Enterprise, Gov F2 и Horizon, №

Да, Incydr Basic, Advanced и Gov F1.

CrashPlan Cloud, №

Устаревшие тарифные планы, нет.

CrashPlan для малого бизнеса, №

Обзор

Если вы используете операционную систему Windows и состояние резервного копирования не достигает 100 %, одной из возможных причин может быть то, что вы копируете пути к файлам и имена, длина которых превышает 255–260 символов. В этой статье дается техническое объяснение этой проблемы и рекомендуемое решение.

Влияет

Приложение Code42, работающее в Windows (все версии, x86 и x64)

Прежде чем начать

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

Под капотом

У Microsoft есть базовый набор интерфейсов прикладного программирования (API), которые программисты могут использовать для взаимодействия с приложениями в операционной системе Windows. Эти программные интерфейсы часто называют Windows API. Windows API устанавливает максимальную длину имени файла, так что имя файла, включая путь к файлу, не может превышать 255–260 символов.

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

Когда приложение Code42 пытается прочитать эти файлы для резервного копирования, это не удается, потому что Windows не знает, как обращаться с файлом. В этом случае в файле service.log приложения Code42 отображается следующее сообщение об ошибке:

Диагностика

Симптомы этой проблемы включают:

  • Ваша резервная копия никогда не достигает 100%
  • Приложение Code42 работает, но некоторые файлы остаются в списке задач резервного копирования.

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

Рекомендуемое решение

Поскольку вы не можете перемещать файлы с помощью проводника Windows, вы должны использовать команду subst, чтобы сократить путь к файлу (файлам).

Самый простой способ исправить это:

  • Замените папку с длинным путем к файлу буквой диска (тем самым сократив общее количество символов для файлов, содержащихся в папке).
  • Скопируйте или переместите файлы из папки в другую папку, не нарушая ограничение
  • Удалить сопоставленную папку

Это можно сделать любым из способов, описанных ниже.

Способ 1. Используйте команду subst, чтобы назначить букву диска определенной папке

Путь к определенной папке можно заменить буквой диска с помощью командной строки Windows и команды subst. Команда имеет следующий формат:

Например, если вы хотите заменить путь к папке C:\Example\File\Path на букву диска Y , введите:

Теперь диск Y: "сопоставляется" непосредственно с папкой. Поскольку вы заменили большую часть длинного пути к файлу на Y: , это больше не нарушает ограничение на количество символов. Теперь вы можете переместить файлы из этой папки в папку с более коротким путем.

После перемещения файлов вы можете удалить виртуальный диск, выполнив команду subst с параметром /d. Чтобы удалить диск Y:, созданный в приведенном выше примере, введите:

Способ 2. Используйте визуальную подстановку, чтобы назначить букву диска определенной папке

Если вам неудобно пользоваться командной строкой Windows, есть бесплатная утилита Visual Subst, которую можно использовать для достижения тех же результатов. Code42 не создает и не тестирует это программное обеспечение. Если вы решите использовать его, мы не сможем предоставить поддержку.

Информацию о программе и пример ее использования можно найти по адресу:

Читайте также: