Как создать, а затем использовать длинные пути Windows из Perl?

У меня есть часть процесса сборки, которая создает ужасно длинные пути в Windows. Это'это не моя вина Это's несколько каталогов глубиной, и ни одно из имен каталогов не является слишком длинным; Oни'просто долго и достаточно много, чтобы сделать это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 кажется, указывает только на страх, который приводит к гневу, который ведет к ненависти и так далее. Там's пример вPerlmonks сообщениеКак оценить файл с именем файла Unicode (UTF16-LE) в Windows?, КажетсяWin32::CreateDirectory это ответ, и яЯ попробую это в следующий раз, когда я доберусь до машины с Windows.

Затем, предположим, я могу создать длинный путь. Теперь я должен научить Module :: Build и, возможно, другим вещам справляться с этим. Это может быть легко с обезьянами, еслиWin32::GetANSIPathName() делает то, что говорит на жестяной банке.

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

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