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

Ответы на вопрос(5)

Ваш ответ на вопрос