У меня есть часть процесса сборки, которая создает ужасно длинные пути в 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, потому что он все еще не работает:
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, и Ян Дюбуа дает немного больше подробностей в Re: "long msgstr "имена файлов в Windows 2K / XP , хотя я не уверен, что это применимо (и очень старое). perlrun упоминает, что это используется для работы переключателя -C
, но, очевидно, эта часть была заброшена. В очереди perl RT имеется более поздняя ошибка 60888: Win32: поддержка полного юникода в именах файлов (используйте системные вызовы) .
Miyagawa отмечает некоторые проблемы с именами файлов Unicode и Win32API :: File без указания длинных путей. Однако запись в Win32API :: File CPAN Forum , похоже, указывает только на страх, который приводит к гневу, к ненависти и так далее. Есть пример в Perlmonks post Как определить в файле файл с именем Unicode (UTF16-LE) в Windows? . Кажется, Win32::CreateDirectory
- это ответ, и я попробую это сделать в следующий раз, когда буду рядом с Windows-машиной.
Тогда, предположим, я могу создать длинный путь. Теперь я должен научить Module :: Build и, возможно, другим вещам справляться с этим. Это может быть легко с обезьянами, если Win32::GetANSIPathName()
делает то, что говорит на жестяной банке.