Отвечая на ваш предыдущий вопрос, я забыл, что 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 .