如何使用Perl在Windows上创建Unicode目录?

时间:2010-02-02 14:29:54

标签: perl unicode directory

我很难创建包含 Unicode 的目录名称。我在Windows XP和Perl Camelbox 5.10.0上。

到目前为止,我曾经use File::Path qw ( make_path )创建目录 - 在第一个西里尔语目录出现之前一直运行良好。

对于文件Win32API::File qw ( CreateFileW ),如果文件名是UTF-16LE编码,则可以正常工作。目录有类似的东西吗?或者可能是一个参数,告诉CreateFileW创建Unicode路径,如果它不存在?

谢谢,
NELE

2 个答案:

答案 0 :(得分:6)

Win32.pmCreateDirectory和朋友提供了一个界面:

  

Win32::CreateDirectory(DIRECTORY)

     

创建DIRECTORY并在成功时返回true值。如果发现扩展错误信息失败,请检查$^E

     

DIRECTORY可能包含系统代码页之外的Unicode字符。创建目录后,您可以使用Win32::GetANSIPathName()获取可以传递给系统调用和外部程序的名称。

上一个答案:

注意:保留此信息用于记录,因为您试图直接在程序中使用CreateDirectoryW

要手动执行此操作,请使用CreateDirectoryW导入Win32::API

Win32::API->Import(
    Kernel32 => qq{BOOL CreateDirectoryW(LPWSTR lpPathNameW, VOID *p)}
);

您需要对$path的{​​{1}}进行编码:

CreateDirectoryW
E:\> dir
2010/02/02  01:05 PM              волгогра́д
2010/02/02  01:04 PM              москва

答案 1 :(得分:0)

刚刚更新2018年的这个问题。

令人难以置信的是,ActivePerl 5.24 仍然不支持简单地将Unicode路径传递给open() / mkdir()和扩展名File::Path::mkpath(),因为底层的Perl代码仍然称为20世纪的ASCII版Windows CreateFile()。疯狂!这怎么可能比在这10年间无数的模糊Perl变化更优先考虑?!

如果您使用utf8,这是真的甚至;或无数其他咒语。

所以,即使在今天,我们仍然需要为这个最基本的功能(创建/访问Unicode文件名)提供Windows的特例代码。

幸运的是,Win32::Unicode模块有一个很好的,易于使用的Win32::Unicode::Dir::mkpathW()函数,它完全符合您的要求,适用于Unicode(以及出色的copyW()和{{} 1}}功能)。

不幸的是,由于Perl 5.16和ActiveState从其便利的ppm存储库(https://code.activestate.com/ppm/Win32-Unicode/)中删除了它,因此该模块尚未通过其安装测试。

幸运的是,有一种方法可以让它正常工作,因为失败的3个测试(与“print”相关)不用于创建文件/目录:

第1步:moveW()

第2步:ppm install dmake

第3步:ppm install MinGW然后perl -MCPAN -e shell

即使您的计算机上已安装Microsoft Visual Studio,也需要执行步骤1和步骤2;显然Perl现在用MinGW构建,模块必须也是。

呼。