我很难创建包含 Unicode 的目录名称。我在Windows XP和Perl Camelbox 5.10.0上。
到目前为止,我曾经use File::Path qw ( make_path )
创建目录 - 在第一个西里尔语目录出现之前一直运行良好。
对于文件Win32API::File qw ( CreateFileW )
,如果文件名是UTF-16LE编码,则可以正常工作。目录有类似的东西吗?或者可能是一个参数,告诉CreateFileW
创建Unicode路径,如果它不存在?
谢谢,
NELE
答案 0 :(得分:6)
Win32.pm为CreateDirectory
和朋友提供了一个界面:
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构建,模块必须也是。
呼。