Как создать, а затем использовать длинные пути Windows из Perl?
У меня есть часть процесса сборки, которая создает ужасно длинные пути в Windows. Это не моя вина. Это несколько каталогов глубиной, и ни одно из имен каталогов не слишком длинное; они просто длинные и достаточно многочисленные, чтобы сделать этоMAX_PATH
(260 символов). Я не использую ничего кроме ASCII в этих именах.
Большая проблема заключается в том, что взрыв происходит глубоко в кишечникеМодуль :: Строить вовремя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: «длинные» имена файлов в Windows 2K / XP, хотя я не уверен, что это применимо (и является чрезвычайно старым).PerlRun упоминает, что это использовать, чтобы быть работой-C
переключатель, но, видимо, эта часть была заброшена. В очереди Perl RT есть более поздняя ошибка60888: Win32: поддержка полного юникода в именах файлов (используйте системные вызовы).
Miyagawaотмечает некоторые проблемы с именами файлов в Юникоде а такжеWIN32API :: Файл без упоминания длинных путей. ОднакоWin32API :: File CPAN Forum entry кажется, указывает только на страх, который приводит к гневу, который ведет к ненависти и так далее. Есть пример вPerlmonks ПочтаКак оценить файл с именем файла Unicode (UTF16-LE) в Windows?, КажетсяWin32::CreateDirectory
это ответ, и я попробую это в следующий раз, когда буду рядом с машиной Windows.
Затем, предположим, я могу создать длинный путь. Теперь я должен научить Module :: Build и, возможно, другим вещам справляться с этим. Это может быть легко с обезьянами, еслиWin32::GetANSIPathName()
делает то, что говорит на жестяной банке.