Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl将目录及其文件和子目录添加到zip存档中_Perl - Fatal编程技术网

使用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等。。