在perl

时间:2015-12-10 17:01:14

标签: linux perl zip archive

我有以下perl脚本,用于接受将所有用户数据文件存档为zip文件然后删除原始数据的命令行参数。该脚本没有问题,但是当以不同的用户作为参数再次运行时,它会覆盖userData.zip文件中的先前数据。我搜索过但无法找到如何执行此任务。它应该继续接受用户作为参数,并将其文件夹附加到userData.zip文件。

感谢任何帮助。

use 5.14.2;
use strict;
use warnings;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use File::Path;
my ($DATAFILEIN, $DATAFILEOUT);
my ($new,$zip);
use constant COLUMNS => 6;

sub main {
    verifyArguments();
    setDataFileIn();
    zipFiles();
    deleteUserFiles();
    #setDataFileOut();
    #printData();
    #writeData();  
}


sub verifyArguments {
if (!(@ARGV) || !(-e $ARGV[0])) {
    die "\n\nYou must specify correct file name upon command invocation.\n\n";
}
}

sub setDataFileIn {
    $DATAFILEIN = $ARGV[0];
}

sub zipFiles {
    print "\nBacking up ".$DATAFILEIN."\n";
    sleep 1;

    $zip = Archive::Zip->new();
    opendir (DIR, $DATAFILEIN) or die $!;

     while (my $file = readdir(DIR)) {

    # Use -f to look for a file
    next unless (-f $DATAFILEIN."\\".$file);

 $zip->addFile($DATAFILEIN."\\".$file, );
print "Added $file to zip\n";
   }
closedir(DIR);
my $fileName = $DATAFILEIN;
unless ( $zip->writeToFileNamed('userData.zip') == AZ_OK ) {
    die 'write error';
   }
print "Successfully backed up $fileName to userData.zip\n";
}

sub deleteUserFiles{
    rmtree($DATAFILEIN);

}


main();

1 个答案:

答案 0 :(得分:1)

您是否阅读过Archive :: Zip FAQ的这一部分?

  

无法读取/修改/编写相同的Zip文件

     

问:为什么我无法打开Zip文件,添加成员并将其写回?我明白了   我尝试时出现错误信息。

     

答:因为Archive :: Zip不会(并且通常不能)读取文件   内容进入内存,原始的Zip文件需要留在身边   直到新文件的写入完成。

     

执行此操作的最佳方法是将Zip写入临时文件   然后将临时文件重命名为旧名称(可能在之后   删除旧的。)

     

Archive :: Zip v1.02添加了归档方法overwrite()和   overwriteAs()简单而谨慎地执行此操作。

     

有关此技术的示例,请参阅examples / updateZip.pl。

我的代码中没有$zip->overwrite()

查找CPAN模块信息的最佳位置是http://search.cpan.org。在这种情况下,Archive::Zip页面。该页面有Archive :: Zip :: FAQ的文档链接。您可以在那里阅读,或者您可以在已安装模块的系统上键入perldoc Archive::Zip::FAQ

示例是下载包的一部分。如果您使用cpan命令安装Archive :: Zip,那么示例将位于构建位置。默认情况下,这将是~/.cpan/build/Archive-Zip-*/examples