如何在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目录的存在?

+0

这是什么平台?操作系统之间的文件名编码规则很可能不同。 – unwind 2010-02-03 13:14:36

+0

哦,对不起!我在Windows XP和Perl Camelbox 5.10.0上。 – 2010-02-03 13:21:04

当回答您先前的问题时,我忘了Win32.pm提供了一个体面的界面。我会回去和那个答案。但是,对于您的直接问题,当CreateDirectory呼叫失败时,您需要做的不是自动die,而是检查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文件操作还是有点混乱。

就我所了解的这些事情而言,如果您希望能够使用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有很多模块可以帮助你。

+0

就目录创建而言,我理解您的示例。但是为什么我需要ANSI路径以及我应该如何处理这种表示?谢谢,思南! – 2010-02-03 15:00:36

+0

@Nele请参阅@jrockways评论:http://stackoverflow.com/questions/2150651/perl-and-apache-on-windows-who-does-that/2150679#2150679 – 2010-02-03 15:27:04

+1

始终支持Windows上的Unicode。 ANSI不是一个适当的替代品。默认路径 - 通常是唯一可以使用的路径 - 是本地化的。更糟糕的是,我的文档路径和每个用户的AppData将包含用户名,即Unicode。即使在英文版Windows中,您也可以拥有中文用户,中文名称。 – MSalters 2010-02-03 15:44:23