gpt4 book ai didi

perl - 如何在 Windows 上的 Perl 中将具有 UTF-8 文件名的文件复制到另一个 UTF-8 文件名?

转载 作者:行者123 更新时间:2023-12-04 12:14:54 24 4
gpt4 key购买 nike

例如,给定一个空文件 テスト.txt ,我将如何制作一个名为 テスト.txt.copy 的副本?

我的第一次破解成功地访问了该文件并创建了新的文件名,但生成的副本テスト.txt.copy .

这是我第一次破解它:

#!/usr/bin/env perl

use strict;
use warnings;

use English '-no_match_vars';
use File::Basename;
use Getopt::Long;

use File::Copy;
use Win32;

my (
$output_relfilepath,
) = process_command_line();

open my $fh, '>', $output_relfilepath or die $!;
binmode $fh, ':utf8';
foreach my $short_basename ( glob( '*.txt') ) {

# skip the output basename if it's in the glob
if ( $short_basename eq $output_relfilepath ) {
next;
}

my $long_basename = Win32::GetLongPathName( $short_basename );
my $new_basename = $long_basename . '.copy';

print {$fh} sprintf(
"short_basename = (%s)\n" .
" long_basename = (%s)\n" .
" new_basename = (%s)\n",
$short_basename,
$long_basename,
$new_basename,
);
copy( $short_basename, $new_basename );
}

printf(
"\n%s done! (%d seconds elapsed)\n",
basename( $0 ),
time() - $BASETIME,
);

# === subroutines ===

sub process_command_line {

# default arguments
my %args
= (
output_relfilepath => 'output.txt',
);

GetOptions(
'help' => sub { print usage(); exit },
'output_relfilepath=s' => \$args{output_relfilepath},
);

return (
$args{output_relfilepath},
);
}

sub usage {
my $script_name = basename $0;

my $usage = <<END_USAGE;
======================================================================

Test script to copy files with a UTF-8 filenames to files with
different UTF-8 filenames. This example tries to make copies of all
.txt files with versions that end in .txt.copy.

usage: ${script_name} (<options>)

options:

-output_relfilepath <s> set the output relative file path to <s>.
this file contains the short, long, and
new basenames.
(default: 'output.txt')

----------------------------------------------------------------------

examples:

${script_name}

======================================================================
END_USAGE

return $usage;
}

这里是 output.txt的内容执行后:
short_basename = (BD9A~1.TXT)
long_basename = (テスト.txt)
new_basename = (テスト.txt.copy)

我试过替换 File::Copy的带有系统调用的复制命令:
my $cmd = "copy \"${short_basename}\" \"${new_basename}\"";
print `$cmd`;

并使用 Win32::CopyFile:
Win32::CopyFile( $short_basename, $new_basename, 'true' );

不幸的是,我在两种情况下都得到了相同的结果( テスト.txt.copy)。对于系统调用,打印显示 1 file(s) copied.正如预期的那样。

笔记:
  • 我正在通过 Strawberry Perl 运行 Perl 5.10.0在 Windows 7 专业版
  • 我使用 Win32访问长文件名的模块
  • glob 返回短文件名,我必须使用它来访问文件
  • テスト = katakana 中的测试 (tesuto)
  • 我已阅读 perlunitutThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
  • 最佳答案

    CopyFileW 应该可以做到这一点函数来自 Win32API::File ,应包含在草莓中。我自己从来没有弄乱过 Unicode 文件名,所以我不确定细节。您可能需要使用 Encode手动将文件名转换为 UTF-16LE ( encode('UTF16-LE', $filename) )。

    关于perl - 如何在 Windows 上的 Perl 中将具有 UTF-8 文件名的文件复制到另一个 UTF-8 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2304319/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com