【问题标题】:How do I check if a Unicode directory exists on Windows in Perl?如何在 Perl 中检查 Windows 上是否存在 Unicode 目录?
【发布时间】:2010-02-03 13:12:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这是在什么平台上?文件名编码规则很可能因操作系统而异。
  • 哦,对不起!我使用的是 Windows XP 和 Perl Camelbox 5.10.0。

标签: perl unicode directory


【解决方案1】:

在回答您之前的问题时,我忘记了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 文件操作有点混乱。

据我了解,如果您希望能够使用诸如 open 之类的 Perl 函数来处理包含 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 路径,我应该如何处理这个表示?谢谢你,思南!
  • @Nele 请参阅@jrockways 评论:stackoverflow.com/questions/2150651/…
  • 在 Windows 上始终支持 Unicode。 ANSI 不是合适的替代品。默认路径(通常是您可以使用的唯一路径)已本地化。更糟糕的是,我的文档路径和每个用户的 AppData 将包含用户名,即 Unicode。即使在英文 Windows 上,您也可以拥有中文用户,使用中文名称。
  • @MSalters:感谢您的建议。是的 - 我们也有在其路径中具有 Unicode 目录名称的用户。我忘记了。
  • 我知道。如果这是我的选择,我不会投票支持 Windows 上的 Perl。这就是整个故事 ;-) “天哪,截止日期是昨天,我们还没有产品——谁能写出一个快速的原型?”当我的同事告诉我他自愿让我担任这份工作时,我几乎要死了。
猜你喜欢
  • 2011-09-07
  • 2017-07-14
  • 1970-01-01
  • 2011-01-12
  • 2012-09-12
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多