Преодоление ограничений максимальной длины пути в Windows

36

Один из наших клиентов обычно использует очень длинные имена путей (несколько вложенных папок с длинными именами), и мы регулярно сталкиваемся с «проблемами обучения пользователей», чтобы сократить путь до менее чем 260 символов.

Имеется ли техническое решение, можем ли мы щелкнуть какой-то переключатель в Windows 7 и Windows 2008 R2, чтобы сказать: «Да, просто проигнорируйте эти исторические проблемы и сделайте так, чтобы имя пути +260 символов работало».

PS Я прочитал и был полностью не объединен именами файлов, путей и пространств имен

Кристофер Эдвардс
источник
3
Здесь мы находимся в 2018 году, и проблема все еще существует в РОБОКОПИИ. 255 лимит. Те, кто превышает его, просто издают звуковой сигнал, но не копируют.
SDsolar
@Sdsolar: вы используете старую версию robocopy?
Найкровек
Да, собирался сказать то же самое - нужно использовать robocopy специально, потому что он может обрабатывать длинные пути ...
Роб Николсон

Ответы:

12

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

sysadmin1138
источник
5
Ошибка в программном обеспечении MS, которая была исправлена ​​для нескольких выпусков ОС, это новая ...
Hubert Kario
2
Windows 10 1607 наконец-то исправила проблему с файловым браузером, и у нее появилось немного волшебства, чтобы обмануть приложения Win32 для работы в этом странном новом мире огромных путей: howtogeek.com/266621/…
HackSlash
28

Просто упоминания об уловке, которую я здесь пока не вижу.

Возьмите этот файл, например:

C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

Этот полный путь к файлу составляет 290 символов. Оболочка (Windows Explorer) и большинство утилит командной строки, вероятно, не позволят вам прикоснуться к ней.

Используйте substкоманду так:

subst X: "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow"

Теперь вы можете получить доступ (и удалить, переместить и т. Д.) К файлу таким образом:

X:\Still Going\I will run out of ideas soon\I have organizational problems\Obsessive compulsive subdirectory disorder\Here is a guid for no good reason\936DA01F-9ABD-4d9d-80C7-02AF85C822A8\Almost there\Tax Returns\2013\2013_tax_return.pdf

И теперь это имя файла составляет всего ~ 235 символов или около того, так что вы больше не столкнетесь с проблемами «Имя файла слишком длинное».

В Windows API есть печально известная константа, известная как MAX_PATH. MAX_PATH - 260 символов. Файловая система NTFS фактически поддерживает пути к файлам длиной до 32 767 символов. И вы по-прежнему можете использовать длинные имена путей длиной 32 767 символов, получая доступ к Unicode (или «широким») версиям функций Windows API, а также используя префикс пути \\?\.

MAX_PATHбыл заложен в камень очень давно в мире Windows. Я думаю, что это как-то связано со стандартами ANSI в то время ... но это одна из тех вещей, которые Microsoft очень трудно изменить сейчас, так как сейчас у нас есть тысячи программ и приложений, включая некоторые, написанные самими Microsoft, которые используют MAX_PATHи потерпит неудачу странным образом, если константа внезапно изменится. (Переполнение буфера, повреждение кучи и т. Д.)

Райан Райс
источник
9
Я придерживался подхода, аналогичного substиспользованию соединений каталогов, который может быть более удобным для очистки, если вы просто хотите внести несколько быстрых изменений. Я использую Link Shell Extension , но вы можете просто использовать mklinkкоманду следующим образом: mklink /J C:\Wow "C:\Folder1\Really Long Path\Such Recursion\So Deep\Wow".
Чарльз Грюнвальд,
10

Вы можете обойти это ограничение, используя обозначение \\? \ C :. Это некрасиво, но поддерживает длину файла до 2 ^ 15.

http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx#maxpath

Крис К
источник
2
Да, я прочитал это, как я сказал (см. Мою ссылку). Но как мне извлечь из этого выгоду? Могу ли я подключить диск к \\? \ Что-нибудь, например. Я не понимаю Статья предназначена для программистов, использующих Windows API. Пока я пишу код в .NET по мере необходимости, я не использую C ++ и т. Д. И не могу понять, насколько это актуально для моих клиентов, которые используют проводник Windows и общий диалог файлов и т. Д.
Кристофер Эдвардс,
1
В конечном счете, нет ни одного. : - / К сожалению.
Крис К
@ChristopherEdwards Вы можете создавать соединения для точек ниже в иерархии папок.
Хьюберт Карио
1
@ChristopherEdwards, вы можете сделать ссылку c:\usr-dataна `c: \ Users \ VeryLongUserName \ LongFolderName` и сказать ему, чтобы использовать первое, но если он регулярно называет папки из 40 символов, то это не поможет ...
Хуберт Карио
2
7-zip с удовольствием просмотрит и скопирует в \\? \ C: нотацию, чего бы это ни стоило.
Мэтт Лайонс
9

У Microsoft теперь есть доступное исправление для этого, начиная с Windows 10, что объясняется в статье MSDN « Имена файлов, пути и пространства имен» .

darthcoder уже ответил подробностями об обходе \\?\C:нотации, но теперь есть раздел реестра, по HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)которому можно удалить ограничения MAX_PATH для одной системы. В статье также упоминается поддержка управления групповой политикой Computer Configuration > Administrative Templates > System > Filesystem > Enable NTFS long pathsдля организации или для групповой реализации, если это необходимо.

JimNim
источник
У меня не было времени для тщательного тестирования, но я пока видел смешанные результаты с этим решением и не могу подтвердить, что это решает проблему для Windows [file] Explorer.
JimNim
2
Это не работает в File Explorer, потому что, хотя система и NTFS могут обрабатывать длинные пути, Explorer не может, пока он сам не будет перекодирован.
ingehere
PS, вам нужно будет использовать одну из программ копирования в этой ссылке SO поверх Explorer, чтобы фактически заставить ее работать.
ingehere
1
Хорошая информация! Я, вероятно, просто буду придерживаться Robocopy в этом случае.
ДжимНим