如何使用Perl检查zip Fie是否为空

时间:2019-07-10 08:41:13

标签: perl

我正在编写一个Perl scipt,它将zip文件解压缩并将zip文件的内容移动到目录中,但是我想跳过其中没有任何内容的zip文件。如何过滤这些文件。要解压缩文件,我正在使用

unzip_content = system("unzip -d <directory> -j -a <filepath>")

任何人都可以建议我检查它是否不包含任何东西。

我尝试使用-s $filename检查文件大小,但是后来我得到了一些文件大小为22字节但没有内容的文件。

2 个答案:

答案 0 :(得分:4)

您可以使用Archive::Zip来实现Perl程序中的所有功能而无需掏空。您需要检查档案文件中是否包含任何内容,可以通过numberOfMembers method完成。

use strict;
use warnings;
use Archive::Zip qw/:ERROR_CODES/;

my @files = ...;
foreach my $file (@files) {
    my $zip = Archive::Zip->new;

    # skip if archive cannot be opened
    next unless $zip->read($file) == AZ_OK;

    # skip if archive is empty
    next unless $zip->numberOfMembers;

    # extract everything
    $zip->extractTree({zipName => '<directory>'});
}

答案 1 :(得分:1)

检查同一件事的另一种方法是计算文件的MD5哈希值。所有空zip文件的MD5哈希将为76cdb2bad9582d23c1f6f4d868218d6c。 有用的链接:
minimum size zip file
Digest::MD5

use strict;
use warnings;
use Digest::MD5  qw(md5 md5_hex md5_base64);

my $filedir = "/home/docs/file.zip";

open FILE, "$filedir";
my $ctx = Digest::MD5->new;
$ctx->addfile (*FILE);
my $hash = $ctx->hexdigest;
close (FILE);

if($hash eq '76cdb2bad9582d23c1f6f4d868218d6c')
{
# empty file
}