我不想在提取存档时看到以下消息。
format error: file is too short at /usr/share/perl5/Archive/Zip/Archive.pm line 667.
Archive::Zip::Archive::_findEndOfCentralDirectory('Archive::Zip::Archive=HASH(0x8acf47c)', 'IO::File=GLOB(0x8ac9d70)') called at /usr/share/perl5/Archive/Zip/Archive.pm line 581
Archive::Zip::Archive::readFromFileHandle('Archive::Zip::Archive=HASH(0x8acf47c)', 'IO::File=GLOB(0x8ac9d70)', 'some zip file') called at /usr/share/perl5/Archive/Zip/Archive.pm line 548
我想跳过一些损坏的档案。
乱 SIGWARN 处理程序或将 STDERR 输出重定向到空设备是非常不整洁的。
Archive::Zip
有一个功能来设置错误处理程序Archive::Zip::setErrorHandler
。默认设置是使用 Carp::carp
,这将生成您看到的输出。
您可以编写自己的替换,例如将错误消息保存在数组中以供以后检查,如下所示
my @errors;
Archive::Zip::setErrorHandler(sub { push @errors, $_[0] });
另外不要忘记检查函数的返回代码,否则将无法知道存在问题。
发出此错误的函数的位置,可以在本地重写警告处理程序以忽略警告。
sub f {
...
local $SIG{__WARN__} = sub { # do nothing };
}
现在,函数 f 中发出的所有警告都将路由到本地警告处理程序,该处理程序不执行任何操作。
您应该注意,Archive::Zip 有一个错误标志AZ_OK
从大多数操作返回。例如:
# Read a Zip file
my $somezip = Archive::Zip->new();
if ( $somezip->read( 'someZip.zip' ) != AZ_OK ) {
die 'read error';
}
`command-to-extract-file 2>/dev/null`
Pipes stderr to/dev/null
这适用于 linux。不确定窗户??