我需要检查Perl中是否存在Unicode目录。我使用的是Windows XP和Perl Camelbox 5.10.0。
如果我尝试创建一个已存在的目录(如Sinan建议stackoverflow.com/questions/2184726),程序将会死亡。
不幸的是if ( !-d $dir_name ) { # create directory $dir_name }
似乎无法识别Unicode目录,或者我正在做一些完全愚蠢的事情。我在检查之前尝试对目录名进行编码,但结果是一样的。
如何检查Unicode目录是否存在?
答案 0 :(得分:2)
在回答您之前的问题时,我忘了Win32.pm提供了一个不错的界面。我会回去那个答案。但是,对于您当前的问题,您需要做的是在die
调用失败时自动CreateDirectory
,而是检查error code。如果错误代码为0xb7
(ERROR_ALREADY_EXISTS
),那么请继续您的快乐方式。
问题是,当您拥有Unicode文件名时,使用Perl函数很难以愉快的方式进行。解决方案是使用Win32::GetANSIPath
(只需密切注意路径的全长):
#!/usr/bin/perl
use strict; use warnings;
use utf8;
use Encode qw( encode );
use File::Slurp;
use File::Spec::Functions qw( catfile );
use Win32;
use Win32::API;
use constant ERROR_ALREADY_EXISTS => 0xb7;
my $dir_name = 'Волгогра́д';
unless ( Win32::CreateDirectory($dir_name) ) {
my $err = $^E;
if ( $err == ERROR_ALREADY_EXISTS ) {
warn "Directory exists, no problem\n";
}
else {
die Win32::FormatMessage($^E);
}
}
my $ansi_path = Win32::GetANSIPathName($dir_name);
warn "$ansi_path\n";
哦,祝你好运删除该目录。
但是,严肃地说,整个Windows Unicode文件操作有点混乱。
据我所知,如果您希望能够使用open
等Perl函数来处理包含Unicode字符的路径,则需要ANSI路径名。 E.g:
my $file = catfile($dir_name, 'test.txt');
open my $fh, '>', $file
or die "cannot create '$file': $!";
会失败,而
my $file = catfile($ansi_path, 'test.txt');
open my $fh, '>', $file
or die "cannot create '$file': $!";
会成功(至少在我的系统上)。如果您只使用Win32 API函数来处理文件(在您的情况下可能更容易),则不需要ANSI路径。有许多模块可以帮助你在CPAN上使用后者。