私は、Windowsで恐ろしく長いパスを作成するビルドプロセスの一部を持っています。それは私のせいではありません。いくつかのディレクトリの深さであり、どのディレクトリ名も異常に長くはありません。それらはちょうど長く、それを超えるのに十分な数ですMAX_PATH
(260文字)。これらの名前にはASCII以外のものは使用していません。
大きな問題は、ターゲット中にModule :: Buildの内部で爆発が発生するdist
ことですが、同じディレクトリを作成するため、ビルドシステムは重要ではないと思います。
これらの長すぎるディレクトリの1つを作成すると、File::Path
失敗します。
use File::Path qw( make_path );
make_path( 'C:\\.....' ); # fails if path is over 260 chars
同様に、絶対パスが通過すると、各ディレクトリレベルを手動で構築することは失敗しますMAX_PATH
。
これは新しいことではなく、Perlのせいでもありません。マイクロソフトは、ファイル、パス、名前空間の命名にそれを文書化しています。彼らの修正は\\?\
、Unicodeファイル名APIにアクセスするためにパスの前にを追加することを提案しています。ただし、それでも失敗するため、Perlスクリプトの完全な修正ではないようです。
use File::Path qw( make_path );
make_path( '\\\\?\\C:\\.....' ); # still fails if path is over MAX_PATH, works otherwise
これはmake_path
、引数を引き離してから、一度に1レベルずつディレクトリを通過するため、\\?\
内にある最上位レベルにのみ適用されるためである可能性がありますMAX_PATH
。
私はActiveStateにバグレポートを掘り起こし、Unicodeファイル名を取得するために修正する必要がある他の何かがあることを示唆しています。JanDuboisは、Re:Windows 2K/XPの「長い」ファイル名についてもう少し詳しく説明しています。それが適用されるかどうかわからない(そして非常に古い)。perlrunは、これがスイッチの仕事であると述べていますが-C
、明らかにその部分は放棄されました。perl RTキューには、より最近のバグ60888があります。Win32:ファイル名で完全なUnicodeをサポートします(ワイドシステムコールを使用)。
宮川氏は、長いパスについて特に言及せずに、 Unicodeファイル名の問題とWin32API::Fileについて言及しています。ただし、Win32API :: File CPANフォーラムのエントリは、恐れのみを示しているようです。これは怒りにつながり、憎しみにつながります。Perlmonksの投稿に例があります。WindowsでUnicode(UTF16-LE)ファイル名のファイルを統計する方法は?。それWin32::CreateDirectory
が答えのようです。次にWindowsマシンの隣に着いたときに、それを試してみます。
次に、ロングパスパスを作成できると仮定します。今、私はそれを処理するために、Module :: Build、そして多分他のことを教えなければなりません。それが缶に言うことをするならば、それはmonkeypatchesですぐに簡単かもしれませんWin32::GetANSIPathName()
。