Как я могу проверить, существует ли каталог Unicode в Windows в Perl? - PullRequest
1 голос
/ 03 февраля 2010

Мне нужно проверить, существует ли каталог Unicode в Perl. Я использую Windows XP и Perl Camelbox 5.10.0.

Если я попытаюсь создать каталог (как предложил Синан stackoverflow.com / questions / 2184726 ), который уже существует, программа умрет.

К сожалению if ( !-d $dir_name ) { # create directory $dir_name }, похоже, не распознает каталоги Unicode, или я делаю что-то совершенно глупое. Я пытался закодировать имя каталога перед проверкой, но результат тот же.

Как проверить наличие каталога Unicode?

1 Ответ

2 голосов
/ 03 февраля 2010

Отвечая на ваш предыдущий вопрос, я забыл, что Win32.pm обеспечивает достойный интерфейс.Я вернусь и этот ответ.Однако для решения вашей непосредственной проблемы вам нужно не автоматически die при сбое вызова CreateDirectory, а проверить код ошибки .Если код ошибки 0xb7 (ERROR_ALREADY_EXISTS), вы идете своим веселым путем.

Проблема заключается в том, что трудно идти своим веселым путем, используя функции Perl, когда у вас есть имя файла Unicode,Решение состоит в том, чтобы использовать 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";

О, и удачи в удалении этого каталога.

В серьезномОднако в целом все операции с файлами в Unicode в Windows немного запутаны.

Насколько я понимаю, вам нужен путь ANSI, если вы хотите использовать такие функции Perl, какopen для работы с путями, содержащими символы Юникода.Например:

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': $!";

удастся (по крайней мере, в моей системе).Вам не нужны пути ANSI, если вы собираетесь использовать только функции Win32 API для работы с файлами (и это может быть проще в вашем случае).Есть несколько модулей, которые помогут вам с последним на CPAN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...