У меня есть часть процесса сборки, которая создает ужасно длинные пути в Windows. Это не моя вина. Это несколько каталогов глубоко, и ни одно из названий каталогов не является ненормально длинным; они просто длинны и достаточно многочисленны, чтобы сделать это над MAX_PATH
(260 символов). Я не использую в этих именах ничего, кроме ASCII.
Большая проблема заключается в том, что раздутие происходит глубоко в кишках Module:: Build во время цели dist
, хотя я что система сборки не имеет значения, потому что они будут делать одни и те же каталоги.
Создание одного из этих слишком длинных каталогов с помощью File::Path
завершается с ошибкой:
use File::Path qw( make_path );
make_path( 'C:\\.....' ); # fails if path is over 260 chars
Аналогично, построение каждого уровня каталога вручную прерывается, как только абсолютный путь будет проходить MAX_PATH
.
Это не ново, это не ошибка Perl, и Microsoft документирует его в Именование файлов, путей и пространства имен. Их исправление предполагает добавить \\?\
перед любым путем для доступа к API-имени файла Unicode. Однако это не похоже на полное исправление для Perl script, поскольку оно все еще не работает:
use File::Path qw( make_path );
make_path( '\\\\?\\C:\\.....' ); # still fails if path is over MAX_PATH, works otherwise
Это может быть связано с тем, что make_path
отделяет свой аргумент и затем проходит через каталоги на один уровень за раз, поэтому \\?\
применяется только к верхнему уровню, который находится в пределах MAX_PATH
.
Я выкопал отчет об ошибке для ActiveState, который предлагает мне что-то еще, что мне нужно исправить, чтобы перейти к именам файлов Unicode, а Jan Dubois дает немного больше деталей в Re: "длинные" имена файлов в Windows 2K/XP, хотя я не уверен, что это применимо (и очень старо). perlrun упоминает, что это используется для работы переключателя -C
, но, видимо, эта часть была оставлена. В очереди Perl RT есть более новая ошибка 60888: Win32: поддержка полного юникода в именах файлов (использование широкоэкранных вызовов).
Miyagawa отмечает некоторые проблемы с именами Unicode и Win32API:: File без особого упоминания о длинных дорожках. Тем не менее, Win32API:: File CPAN Forum entry, кажется, указывает только на страх, который приводит к гневу, что приводит к ненависти и т.д. Вот пример в Perlmonks post Как установить файл с Unicode (UTF16-LE) имя файла в Windows?. Кажется, ответ Win32::CreateDirectory
является ответом, и я попробую это в следующий раз, когда я получу рядом с машиной Windows.
Тогда, предположим, что я могу создать путь длинного пути. Теперь я должен учить Module:: Build и, возможно, другие вещи, чтобы справиться с этим. Это может быть немедленно легко с monkeypatches, если Win32::GetANSIPathName()
делает то, что он говорит на олове.