使用Perl将目录及其文件和子目录添加到zip存档中
这是文件夹结构使用Perl将目录及其文件和子目录添加到zip存档中,perl,Perl,这是文件夹结构 9781471839108_epub - 9781471839108_epub_ncx_r1.ncx - 9781471839108_epub_opf_r1.opf - mimetype meta-inf - container.xml oebps - ack.htm - ch01.htm audio - 1.mp3 images
9781471839108_epub
- 9781471839108_epub_ncx_r1.ncx
- 9781471839108_epub_opf_r1.opf
- mimetype
meta-inf
- container.xml
oebps
- ack.htm
- ch01.htm
audio
- 1.mp3
images
- 1-1.jpg
当我想把文件放在二级文件夹(
meta-inf
和oebps
)中时,所有文件都放在主文件夹中
如何将文件放入各自的文件夹中,如
在meta inf
文件夹中,我想将container.xml
文件
下面是由我完成的编码
use warnings;
use strict;
use Cwd;
my $dir = getcwd;
use Archive::Zip;
use Archive::Zip qw( :ERROR_CODES );
use File::Basename 'basename';
my $zip = Archive::Zip->new();
my $isbn_folder = "0";
opendir( min_dir, $dir ) or die "Cannot open $dir: $!";
foreach my $min_file ( readdir min_dir ) {
if ( -d $min_file ) {
$isbn_folder = $min_file;
}
}
closedir min_dir;
my $isbn_folder_path = "$dir/$isbn_folder";
opendir( isbn_dir, $isbn_folder_path ) or die "Cannot open $dir: $!";
my @isbn_files = readdir( isbn_dir );
closedir isbn_dir;
foreach my $isbn_file ( @isbn_files ) {
if ( -f "$isbn_folder_path/$isbn_file" ) {
my @member = $isbn_file;
foreach my $member ( @member ) {
my $mine_file_path_add = "$isbn_folder_path/$member";
my $member = basename $mine_file_path_add;
$zip->addFile( $mine_file_path_add, $member )
or die 'unable to add file to archive';
}
}
if ( -d "$isbn_folder_path/$isbn_file" ) {
my @isbn_folder = $isbn_file;
foreach my $isbn_folder ( @isbn_folder ) {
if ( $isbn_folder =~ m/([0-9a-zA-Z])/ ) {
my @isbn_folder1 = $isbn_folder;
foreach my $isbn_folder1 ( @isbn_folder1 ) {
my $mine_file_path_add = "$isbn_folder_path/$isbn_folder1";
my $member = basename $mine_file_path_add;
$zip->addDirectory( '$mine_file_path_add/', $member )
or die 'unable to add file to archive';
#__________I have problem to put this file on there respective dir______________
opendir( oebps_dir, $mine_file_path_add )
or die "Cannot open $dir: $!";
my @isbn_folder = readdir( oebps_dir );
closedir oebps_dir;
foreach my $isbn_folder ( @isbn_folder ) {
if ( -f "$mine_file_path_add/$isbn_folder" ) {
my @member = $isbn_folder;
foreach my $member ( @member ) {
my $mine_file_path_add =
"$mine_file_path_add/$member";
my $member = basename $mine_file_path_add;
$zip->addFile( $mine_file_path_add, $member )
or die 'unable to add file to archive';
}
}
}
#____________________________________
}
}
}
}
}
unless ( $zip->writeToFileNamed( "d:/perl/Tool/Test/making_epub/temp.zip" ) ==
AZ_OK ) {
die "whoops!";
}
主要问题是,您专门使用
basename
来修剪存储的每个文件或目录中的路径信息。如果完整路径保持不变,它会在zip存档中反映磁盘目录结构
也不需要自己走文件路径,因为Archive::Zip
方法addTree
和addTreeMatching
将为您做到这一点
您还没有解释要做什么,但从Perl代码来看,您似乎只想在zip文件中存储整个目录结构。这里有一个测试
if ( $isbn_folder =~ m/([0-9a-zA-Z])/ )
我认为这只是为了删除
和。
伪目录
选择用于存储的目录是当前目录的最后一个子目录,您可以使用
my $base_folder = ( grep -d, glob '*')[-1];
您可以通过调用addTree
将其保存到zip存档中,如下所示
我使用了一个select
参数,您可以使用该参数选择将哪些文件和目录添加到存档中。在这种情况下,它总是返回true,因此所有内容都被存档,但它可以作为存储哪些文件的有用日志
use strict;
use warnings;
use 5.010;
use Archive::Zip qw/ :ERROR_CODES :MISC_CONSTANTS /;
use constant ZIP_FILE => 'D:\perl\Tool\Test\making_epub\temp.zip';
STDOUT->autoflush;
my $base_folder = ( grep -d, glob '*')[-1];
my $zip = Archive::Zip->new;
$zip->addTree({
root => $base_folder,
select => sub {
say "Storing $_";
1;
},
compressionLevel = DEFLATING_COMPRESSION_NORMAL,
});
$zip->writeToFileNamed(ZIP_FILE) == AZ_OK or die "Failed to save zip file: $!";
say "\nZip file written";
你的问题是…?我不能在其中添加两个级别的文件。在第二个级别中,它有两个文件夹:-(1)meta inf和(2)oebps,在这两个文件夹中都有一些文件,但当我添加这些文件时,所有文件都添加到主目录中,即9781471839108_epub。我不知道为什么(有人能解决我的问题吗?非常感谢你的回复,今天我也尝试使用addTree()及其工作方式。但你对我来说太棒了,因为我对perlhow很陌生,因为我确信我再次需要你的帮助,所以请给我任何联系方式,如fb、what'up、BBM等。。