Como faço para criar, em seguida, usar longos caminhos do Windows a partir do Perl?

Eu tenho parte de um processo de criação que cria um caminho horrivelmente longo no Windows. Não é minha culpa. São vários diretórios profundos e nenhum dos nomes de diretório é anormalmente longo; eles são apenas longos e numerosos o suficiente para superarMAX_PATH (260 caracteres). Eu não estou usando nada além de ASCII nesses nomes.

O grande problema é que a explosão acontece no fundo das entranhasMódulo :: Construir durante odist alvo, apesar de eu achar que o sistema de compilação não importa, porque eles criariam os mesmos diretórios.

Criando um desses diretórios excessivamente longosFile::Path falha:

 use File::Path qw( make_path );

 make_path( 'C:\\.....' ); # fails if path is over 260 chars

Da mesma forma, a construção de cada nível de diretório manualmente falha quando o caminho absoluto passa por cimaMAX_PATH.

Isso não é novidade, não é culpa do Perl, e a Microsoft documenta issoNomeando arquivos, caminhos e espaços para nome. Sua correção sugere adicionar o\\?\ na frente de qualquer caminho para acessar a API de nome de arquivo Unicode. No entanto, essa não parece ser a correção completa para um script Perl porque ainda falha:

 use File::Path qw( make_path );

 make_path( '\\\\?\\C:\\.....' );  # still fails if path is over MAX_PATH, works otherwise

Isso pode ser porquemake_path separa seu argumento e depois passa pelos diretórios um nível por vez, então\\?\ aplica-se apenas ao nível superior, que está dentroMAX_PATH.

Eu desenterrei umrelatório de bug para o ActiveState que sugere que há algo mais que preciso consertar para obter os nomes de arquivos Unicode, e Jan Dubois dá um pouco mais de detalhes emRe: nomes de arquivos "longos" no Windows 2K / XP, embora eu não tenho certeza se isso se aplica (e é extremamente antigo).perlrun menciona que este uso para ser o trabalho do-C mudar, mas aparentemente essa parte foi abandonada. A fila RT perl tem um bug mais recente60888: Win32: suporta unicode completo em nomes de arquivos (use chamadas de sistema amplo).

Miyagawaobserva alguns problemas de nome de arquivo Unicode eWin32API :: File sem mencionar especificamente os longos caminhos. No entanto, oEntrada Win32API :: File CPAN Forum parece indicar apenas medo, o que leva à raiva, que leva ao ódio, e assim por diante. Há um exemplo noPerlmonks postarComo stat um arquivo com um nome de arquivo Unicode (UTF16-LE) no Windows?. Parece que oWin32::CreateDirectory é a resposta, e vou tentar isso da próxima vez que eu chegar ao lado de uma máquina Windows.

Então, supondo que eu possa criar o caminho do caminho longo. Agora eu tenho que ensinar Module :: Build, e talvez outras coisas, para lidar com isso. Isso pode ser imediatamente fácil com monkeypatches seWin32::GetANSIPathName() Faz o que diz na lata.

questionAnswers(5)

yourAnswerToTheQuestion