如何在Perl中检查Windows上是否存在Unicode目录?
我需要检查一个Unicode目录是否存在于Perl中。我使用Windows XP和Perl Camelbox 5.10.0。如何在Perl中检查Windows上是否存在Unicode目录?
如果我尝试创建一个目录(如Sinan在这里建议的stackoverflow.com/questions/2184726),该目录已经存在,程序就会死亡。
不幸的是if (!-d $dir_name) { # create directory $dir_name }
似乎无法识别Unicode目录或我正在做一些完全愚蠢的事情。我试图在检查它之前对目录名进行编码,但结果是一样的。
如何检查Unicode目录的存在?
当回答您先前的问题时,我忘了Win32.pm提供了一个体面的界面。我会回去和那个答案。但是,对于您的直接问题,当CreateDirectory
呼叫失败时,您需要做的不是自动die
,而是检查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文件操作还是有点混乱。
就我所了解的这些事情而言,如果您希望能够使用Perl函数(如open
)来处理包含Unicode字符的路径,则需要ANSI路径名。例如: -
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有很多模块可以帮助你。
就目录创建而言,我理解您的示例。但是为什么我需要ANSI路径以及我应该如何处理这种表示?谢谢,思南! – 2010-02-03 15:00:36
@Nele请参阅@jrockways评论:http://stackoverflow.com/questions/2150651/perl-and-apache-on-windows-who-does-that/2150679#2150679 – 2010-02-03 15:27:04
始终支持Windows上的Unicode。 ANSI不是一个适当的替代品。默认路径 - 通常是唯一可以使用的路径 - 是本地化的。更糟糕的是,我的文档路径和每个用户的AppData将包含用户名,即Unicode。即使在英文版Windows中,您也可以拥有中文用户,中文名称。 – MSalters 2010-02-03 15:44:23
这是什么平台?操作系统之间的文件名编码规则很可能不同。 – unwind 2010-02-03 13:14:36
哦,对不起!我在Windows XP和Perl Camelbox 5.10.0上。 – 2010-02-03 13:21:04