perl gzip意外结束文件

时间:2013-12-01 14:20:08

标签: perl file gzip output

我一直将数据写入档案。在每条记录之后,我需要知道生成的文件的大小。要解决这个问题,我使用缓冲区:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use feature 'say';
use IO::Compress::Gzip qw| $GzipError :flush |;


my $out_file_name = 'out.gz';
my $buf;

open my $out, '>', $out_file_name;

my $ft = Z_PARTIAL_FLUSH;

my $gzip = IO::Compress::Gzip->new(\$buf);
$gzip->print("some data");
$gzip->flush($ft);

$gzip->print("some data2");
$gzip->flush($ft);

print $out $buf;

$gzip->close;
close $out;

当脚本完成后,我测试结果并得到以下错误:

$ gzip -cd out.gz
some data1
some data2
gzip: out.gz: unexpected end of file

为什么会出现此错误。如何避免呢?

1 个答案:

答案 0 :(得分:2)

您必须在将$buf写入输出文件之前关闭gzip流

$gzip->close;
print $out $buf;
close $out;

$gzip->close调用将一些终止数据写入缓冲区的末尾以完成gzip编码。在您的示例中,您没有将此数据写入文件,因此当您尝试稍后解压缩时,gzip无法找到它期望在那里看到的数据。