2015-12-10 98 views
0

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

任何帮助表示赞赏。

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

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

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

问:为什么我不能打开Zip文件,添加成员,并写回信吗?当我尝试时,我收到 错误消息。

答:因为Archive :: Zip没有(也不能一般地)将文件 内容读入内存,所以原始Zip文件需要在 左右,直到完成新文件的写入。

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

Archive :: Zip v1.02添加了覆盖方法overwrite()和 overwriteAs()来做到这一点小心翼翼。

有关此技术的示例,请参阅示例/ 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

+0

你好,谢谢你的回复。这份文件在哪里列出?我在这里搜索了perldoc.perl.org和perlmonks。我只是一个初学者,所以我需要查看示例以了解语法。 – Number41

+1

@ Number41真的吗?在几乎任何搜索引擎上搜索“perl archive :: zip”都会产生一个[CPAN页面](https://metacpan.org/pod/Archive::Zip)作为第一个结果。 –

+0

马特,你是对的,搜索确实会把它作为第一个结果。对不起,我的无知.........只是寻求一些帮助。我想我会在这里找到一个更清晰和简洁的答案,猜测我错了。 – Number41

相关问题