我有一个构建过程的一部分,它在 Windows 中创建了一个非常长的路径。这不是我的错。有好几个目录,而且没有一个目录名异常长;它们足够长且数量足以使其结束MAX_PATH
(260个字符)。我没有在这些名称中使用除 ASCII 以外的任何东西。
最大的问题是,在目标期间, Module::Build的内部深处发生了爆炸dist
,尽管我认为构建系统并不重要,因为它们会创建相同的目录。
创建这些过长目录之一File::Path
失败:
use File::Path qw( make_path );
make_path( 'C:\\.....' ); # fails if path is over 260 chars
同样,一旦绝对路径超过,手动构建每个目录级别都会失败MAX_PATH
。
这不是新的,也不是 Perl 的错,微软在Naming Files, Paths, and Namespaces中记录了它。他们的修复建议\\?\
在任何路径前添加访问 Unicode 文件名 API 的路径。但是,这似乎不是 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 文件名,Jan Dubois 在Re: "long" filenames on Windows 2K/XP中提供了更多详细信息,尽管我是不确定它是否适用(并且非常旧)。perlrun提到这个用途是-C
开关的工作,但显然那部分被放弃了。perl RT 队列有一个更新的错误60888:Win32: support full unicode in filenames (use Wide-system calls)。
Miyagawa注意到一些 Unicode 文件名问题和Win32API::File,但没有特别提到长路径。但是,Win32API::File CPAN 论坛条目似乎只表示恐惧,这会导致愤怒,这会导致仇恨,等等。Perlmonks帖子中有一个示例How to stat a file with a Unicode (UTF16-LE) filename in Windows? . 似乎这Win32::CreateDirectory
就是答案,下次我在 Windows 机器旁边时会尝试这样做。
然后,假设我可以创建长路径路径。现在我必须教 Module::Build,也许还有其他东西来处理它。Win32::GetANSIPathName()
如果按照锡上所说的那样使用monkeypatches,这可能会立即变得容易。