我有以下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();
答案 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
。