如何在Perl中检查Windows上是否存在Unicode目录?

时间:2010-02-03 13:12:35

标签: perl unicode directory

我需要检查Perl中是否存在Unicode目录。我使用的是Windows XP和Perl Camelbox 5.10.0。

如果我尝试创建一个已存在的目录(如Sinan建议stackoverflow.com/questions/2184726),程序将会死亡。

不幸的是if ( !-d $dir_name ) { # create directory $dir_name }似乎无法识别Unicode目录,或者我正在做一些完全愚蠢的事情。我在检查之前尝试对目录名进行编码,但结果是一样的。

如何检查Unicode目录是否存在?

1 个答案:

答案 0 :(得分:2)

在回答您之前的问题时,我忘了Win32.pm提供了一个不错的界面。我会回去那个答案。但是,对于您当前的问题,您需要做的是在die调用失败时自动CreateDirectory,而是检查error code。如果错误代码为0xb7ERROR_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上使用后者。