2011-05-27 116 views

回答

4

您不能直接获取未压缩文件的大小,但可以使用查找。从文件创建一个对象并尝试寻找第一个字节。如果您可以查找,那么您的文件至少有1个字节的大小,否则它是空的。

#!/usr/bin/env perl 
use strict; 
use warnings; 
use IO::Uncompress::Gunzip; 
use Fcntl qw(:seek); 

my $u = IO::Uncompress::Gunzip->new('readme.gz'); 
if ($u->seek(1, SEEK_CUR)) { 
    print "Can seek, file greather than zero\n"; 
} 
else { 
    print "Cannot seek, file is zero\n"; 
} 
+0

这是最好的方法。我没有想到使用Fcntl并进行寻找。 – 2011-05-31 16:30:36

0

要检查tar压缩文件的内容,请使用

tar -ztvf file.tgz 

要列出的.gz文件的内容,请使用

gzip --list file.gz 

裹在Perl和检查uncompressed场在输出

$ gzip --list fjant.gz 
     compressed  uncompressed ratio uncompressed_name 
       26     0 0.0% fjant 
+1

混合perl和shell通常是一个坏主意,因为结果文件很难读取。 – jeremiah 2013-01-01 14:01:38

2

你可以使用IO::Compress::Gzip附带的Perl 5.10和ABO (或通过CPAN下载)。并用它来读取文件。

但是,您只需在文件上执行stat并查看它是否仅包含26个字节,因为空文件仅包含26个字节的标头。

我想这只是取决于你正在尝试做什么。你只是试图确定一个gzip文件是否为空,或者你打算先阅读并解压缩它?如果是前者,stat将是最容易的。如果是后者,请使用IO::Compress::Gzip模块,而不是使用一堆system命令来调用gzipIO::Compress::Gzip附带5.10及更高版本的所有Perl发行版,所以它是处理Zip的默认方式。

+0

您无法检查文件大小并将其与“26”进行比较。压缩文件的文件大小取决于文件名。 – 2011-05-27 15:02:27

+0

是的,它不完全是26个字节,但是如果它在25到40个字节之间,它肯定是空的。 – 2011-05-27 15:08:19

+0

压缩之前的完整文件名位于标题中。如果你使用gzip长文件名,它会和文件名+头一样大。如果您的文件名超过40个字节,它可以轻松超过40个字节。 – 2011-05-27 15:22:29

相关问题