使用Archive :: Zip来确定成员是否是文本文件

时间:2016-04-21 19:26:41

标签: perl zip

我正在编写一个脚本,当成员名称与模式匹配时,会使用给定的搜索字符串来grep zip档案成员的内容。

我有以下子处理单个存档(该脚本可以在命令行上使用多个存档):

sub processArchive($$$$) {
    my ($zip, $searchstr, $match, $zipName) = @_;
    print "zip[$zip] searchstr[$searchstr] match[$match] zipName[$zipName]\n";
    my @matchingList = $zip->membersMatching($match);
    my $len = @matchingList;
    if ($len > 0) {
       print $zipName . ":\n";
       for my $member (@matchingList) {
          print "member[$member]\n";
          print "textfile[" . $member->isTextFile() . "] contents[" . $member->contents() . "]\n";
          if ($member->isTextFile()) {
             print "Is a text file.\n";
          }
          else {
             print "Is not a text file.\n";
          }
          my @matchingLines = grep /$searchstr/, $member->contents();
          my $len = @matchingLines;
          if ($len > 0) {
             print @matchingLines;              
          }
      }
   }
}

逻辑还没有完成。我首先尝试调用" isTextFile()"看看它做了什么。我必须做错事,因为我得到了#34;不是文本文件"对于至少一个明显是文本文件的成员。

我还注意到,当我从" isTextFile()"打印返回值时,它总是一个空字符串。这是我应该期望的印刷"真正的"或"假"价值,还是其他的错误?

1 个答案:

答案 0 :(得分:2)

从ZIP文件中的标志中读取“文本文件”状态。许多归档工具没有正确设置此标志,因为它很少使用,并且对正常使用没有影响。

如果您确实需要检查文件是否包含文本,则需要将其解压缩并自行查看。