在文件名中的变音符号上编程
Program dies on umlauts in filename
希望你能帮助我,我找不到我的代码停止的原因。我会感谢每一个改进,我必须使用 Perl,而且我以前从未这样做过!我还必须在 Windows 文件系统上工作。
错误:
Could not open file '' No such file or directory at
C:\Users\schacherl\Documents\perl\tester.pl line 29, line 1.
仅供参考:
FILElog.txt 文件包含像
这样的子文件夹
"vps_bayern_justiz_15027148042584275712825768716427"
EDALOG 包含 EDA 文件
的完全限定 link
"W:\EGVP\manuelle
Nachrichten\heruntergeladene_DONE\EGVP_GP114503661816195610088017045919978\attachments\Staßfurt_AIA100.eda"
在上面这个确切的文件处,程序终止。对于所有其他人,到目前为止它似乎都可以工作,只是那些 "Staßfurt" 它看起来无法处理的文件。如果我像第一个一样用 UTF-8 编码其他文件,我会得到很多
UTF-8 "\x84" does not map to Unicode at
C:\Users\zhengphor\Documents\perl\tester.pl line 32, line 4.
UTF-8 "\x81" does not map to Unicode at
C:\Users\zhengpor\Documents\perl\tester.pl line 32, line 4.
如果我没有 Staßfurt 文件,它也能正常工作。这只是发生错误的部分,我已经排除了 $returner 变量的整个处理。
我将不胜感激!我找不到为什么 Staßfurt 文件会出现这个错误。
#!/usr/local/bin/perl -w -l
use Switch;
use Data::Dumper;
`chcp 65001`;
sub getAusgabe{
`dir "W:\EGVP\manuelle Nachrichten\heruntergeladene\_DONE\ /AD /B 1>FILElog.txt`;
print 'written file log';
my $filename = 'FILElog.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";
while (my $row = <$fh>) {
chomp $row;
if($row ne 'DONE'){
`dir "W:\EGVP\manuelle Nachrichten\heruntergeladene\_DONE\$row\*.eda" /S /B 1>EDAlog.txt`;
print 'written eda log';
my $filename = 'EDAlog.txt';
open(my $fh1, $filename)
or die "Could not open file '$filename' $!";
while(my $row2 = <$fh1>){
chomp $row2;
print 'Datei:'. $row2;
open(my $fh2, $row2)
or die "Could not open file '$$row2' $!";
print 'ich bin drin';
while (my $rowFile = <$fh2>) {
$returner .= $rowFile;
print 'hier könnte ihr text stehen';
}
}
}
}
print 'ich habe fertig';
return $returner;
}
$ausgabe1 = getAusgabe;
在 Windows,您需要:
- 在使用前手动编码文件名(其中包含非 ASCII 字符),或者
- 在使用其文件功能时使用为您完成此操作的包,例如
Win32::LongPath
。
例如:
use strict;
use warnings;
use utf8;
use Win32::LongPath;
my $filename;
my $fh;
$filename = "Unicode file with ä in name.txt";
openL($fh, '>:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' ($^E)";
print $fh "Unicode stuff written to file...\n";
close $fh;
$filename = "Another file with ö in it.txt";
# only three-argument version is supported - MODE argument is always required:
openL($fh, '<', $filename)
or die "Could not open file '$filename' ($^E)";
my @lines = <$fh>;
close $fh;
请注意使用对文件句柄变量 ($fh
) 的引用而不是变量本身。
作为奖励,使用 Win32::LongPath
允许您操作具有超长全名的文件(完整路径超过 260 个字符的通常限制,包括终止 NUL 字符)。 (但是,您不应该养成这样做的习惯,因为许多其他应用程序无法访问此类文件。)
希望你能帮助我,我找不到我的代码停止的原因。我会感谢每一个改进,我必须使用 Perl,而且我以前从未这样做过!我还必须在 Windows 文件系统上工作。
错误:
Could not open file '' No such file or directory at C:\Users\schacherl\Documents\perl\tester.pl line 29, line 1.
仅供参考: FILElog.txt 文件包含像
这样的子文件夹"vps_bayern_justiz_15027148042584275712825768716427"
EDALOG 包含 EDA 文件
的完全限定 link"W:\EGVP\manuelle Nachrichten\heruntergeladene_DONE\EGVP_GP114503661816195610088017045919978\attachments\Staßfurt_AIA100.eda"
在上面这个确切的文件处,程序终止。对于所有其他人,到目前为止它似乎都可以工作,只是那些 "Staßfurt" 它看起来无法处理的文件。如果我像第一个一样用 UTF-8 编码其他文件,我会得到很多
UTF-8 "\x84" does not map to Unicode at C:\Users\zhengphor\Documents\perl\tester.pl line 32, line 4.
UTF-8 "\x81" does not map to Unicode at C:\Users\zhengpor\Documents\perl\tester.pl line 32, line 4.
如果我没有 Staßfurt 文件,它也能正常工作。这只是发生错误的部分,我已经排除了 $returner 变量的整个处理。
我将不胜感激!我找不到为什么 Staßfurt 文件会出现这个错误。
#!/usr/local/bin/perl -w -l
use Switch;
use Data::Dumper;
`chcp 65001`;
sub getAusgabe{
`dir "W:\EGVP\manuelle Nachrichten\heruntergeladene\_DONE\ /AD /B 1>FILElog.txt`;
print 'written file log';
my $filename = 'FILElog.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";
while (my $row = <$fh>) {
chomp $row;
if($row ne 'DONE'){
`dir "W:\EGVP\manuelle Nachrichten\heruntergeladene\_DONE\$row\*.eda" /S /B 1>EDAlog.txt`;
print 'written eda log';
my $filename = 'EDAlog.txt';
open(my $fh1, $filename)
or die "Could not open file '$filename' $!";
while(my $row2 = <$fh1>){
chomp $row2;
print 'Datei:'. $row2;
open(my $fh2, $row2)
or die "Could not open file '$$row2' $!";
print 'ich bin drin';
while (my $rowFile = <$fh2>) {
$returner .= $rowFile;
print 'hier könnte ihr text stehen';
}
}
}
}
print 'ich habe fertig';
return $returner;
}
$ausgabe1 = getAusgabe;
在 Windows,您需要:
- 在使用前手动编码文件名(其中包含非 ASCII 字符),或者
- 在使用其文件功能时使用为您完成此操作的包,例如
Win32::LongPath
。
例如:
use strict;
use warnings;
use utf8;
use Win32::LongPath;
my $filename;
my $fh;
$filename = "Unicode file with ä in name.txt";
openL($fh, '>:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' ($^E)";
print $fh "Unicode stuff written to file...\n";
close $fh;
$filename = "Another file with ö in it.txt";
# only three-argument version is supported - MODE argument is always required:
openL($fh, '<', $filename)
or die "Could not open file '$filename' ($^E)";
my @lines = <$fh>;
close $fh;
请注意使用对文件句柄变量 ($fh
) 的引用而不是变量本身。
作为奖励,使用 Win32::LongPath
允许您操作具有超长全名的文件(完整路径超过 260 个字符的通常限制,包括终止 NUL 字符)。 (但是,您不应该养成这样做的习惯,因为许多其他应用程序无法访问此类文件。)