เพิ่มไฟล์ไปยังพา ธ อื่นในไฟล์ zip


9

ฉันมีไฟล์ที่อยู่ในไดเรกทอรีต่อไปนี้:

folder_A/another_folder_A/file_to_add.xml

ตอนนี้สิ่งที่ฉันต้องการทำคือเพียงเพิ่มไฟล์ไปยังโฟลเดอร์ในไฟล์ zip ที่มีอยู่

ตัวอย่างเช่นนี่คือเนื้อหาไปรษณีย์ของฉัน:

my_zip.zip/folder_B/another_folder_B

ฉันจะเพิ่มfile_to_add.xmlไปanother_folder_B?

my_zip.zip/folder_B/another_folder_B/file_to_add.xml

ฉันไม่ต้องการสร้างโฟลเดอร์ที่มีชื่อเดียวกันและเพิ่มเข้าไป มีคำสั่งให้ฉันทำอย่างนั้นหรือไม่?

คำตอบ:


2

ไม่ทราบวิธีการทำเช่นนี้โดย7zหรือzipเครื่องมือโดยตรง แต่เดาว่าห้องสมุดส่วนใหญ่เช่น perl, python และอื่น ๆ มีzipโมดูล อย่างไรก็ตามคุณไม่สามารถทำได้ใน Bash


นี่เป็นตัวอย่างง่ายๆใน PHP:

กรณีทดสอบ:

$ mkdir -p A/B C/D E/F
$ touch A/B/f1.txt C/D/f2.txt E/F/f3.txt
$ tree .
.
├── A
│   └── B
│       └── f1.txt
├── C
│   └── D
│       └── f2.txt
├── E
│   └── F
│       └── f3.txt

$ ./php_zip -v out.zip -p x/y */*/f?.txt
$ 7z l out.zip

Listing archive: out.zip

Path = out.zip
Type = zip
Physical Size = 310

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2013-04-28 10:24:36 .....            0            0  x/y/f1.txt
2013-04-28 10:24:36 .....            0            0  x/y/f2.txt
2013-04-28 10:24:36 .....            0            0  x/y/f3.txt
------------------- ----- ------------ ------------  ------------------------
                                     0            0  3 files, 0 folders

การใช้งาน:

./php_zip [-v|--verbose] archive.zip [<-p|--path> archive-path] files ...

--verbose    Verbose; print what is added and where.
archive.zip  Output file. Created if does not exist, else extended.
--path       Target path in zip-archive where to add files. 
             If not given source path's are used.
files        0+ files.

If -P or --Path (Capital P) is used empty directory entries is added as well.

รหัส:

(ไม่ได้เข้ารหัส PHP ในระยะเวลานานรหัสมีความหมายอย่างใดอย่างหนึ่งเท่านั้นเป็นตัวอย่างที่จะขยายหรืออื่น ๆ )

#!/usr/bin/php
<?php

$debug = 0;

function usage($do_exit=1, $ecode=0) {
    global $argv;
    fwrite(STDERR, 
        "Usage: " . $argv[0] .  
        " [-v|--verbose] archive.zip" .
        " [<-p|--path> archive-path]" .
        " files ...\n"
    );

    if ($do_exit)
        exit($ecode);
}

$zip_eno = array(
    ZIPARCHIVE::ER_EXISTS => "EXISTS",
    ZIPARCHIVE::ER_INCONS => "INCONS",
    ZIPARCHIVE::ER_INVAL  => "INVAL",
    ZIPARCHIVE::ER_MEMORY => "MEMORY",
    ZIPARCHIVE::ER_NOENT  => "NOENT",
    ZIPARCHIVE::ER_NOZIP  => "NOZIP",
    ZIPARCHIVE::ER_OPEN   => "OPEN",
    ZIPARCHIVE::ER_READ   => "READ",
    ZIPARCHIVE::ER_SEEK   => "SEEK"
);

function zip_estr($eno) {
    switch ($eno) {
    case ZIPARCHIVE::ER_EXISTS: 
    }
}

if ($debug)
    print_r($argv);

if ($argc > 1)
    if ($argv[1] == "-h" || $argv[1] == "--help")
        usage();

if ($argc < 3)
    usage(1, 1);

$verbose = 0;
$path = "";
$add_dir = 0;
$zip  = new ZipArchive();
$i    = 1;

if ($argv[$i] == "-v" || $argv[$i] == "--verbose") {
    if ($argc < 4)
        usage(1, 1);
    $verbose = 1;
    ++$i;
}

$zip_flag = file_exists($argv[$i]) ? 
    ZIPARCHIVE::CHECKCONS : 
    ZIPARCHIVE::CREATE;

if (($eno = $zip->open($argv[$i++], $zip_flag)) !== TRUE) {
    fwrite(STDERR, 
        "ERR[$eno][$zip_eno[$eno]]: ".
        "Unable to open archive " . 
        $argv[$i - 1] . "\n"
    );
    exit($eno);
}

if (
    $argv[$i] == "-P" || $argv[$i] == "--Path" ||
    $argv[$i] == "-p" || $argv[$i] == "--path"
) {
    if ($argc - $i < 2)
        usage(1, 1);
    $path = $argv[$i + 1];
    if (substr($path, -1) !== "/")
        $path .= "/";
    if ($argv[$i][1] == "P")
        $zip->addEmptyDir($path);
    $i += 2;
}

$eno = 0;

for (; $i < $argc; ++$i) {
    if ($path !== "")
        $target = $path . basename($argv[$i]);
    else
        $target = $argv[$i];

    if ($verbose)
        printf("Adding %s to %s\n", $argv[$i], $target);
    if (!$zip->addFile($argv[$i], $target)) {
        fwrite(STDERR, "Failed.\n");
        $eno = 1;
    }
}

$zip->close();

exit($eno);
?>

0

หากไดเรกทอรีของคุณมีชื่อเดียวกันทั้งด้านในและด้านนอก zipfile มันค่อนข้างง่าย ในไดเรกทอรีที่มีคุณสามารถทำได้folderzip my_zip.zip folder -r

หากโครงสร้างของคุณทั้งภายในและภายนอก zipfile นั้นไม่เหมือนกันคุณจะต้องสร้างมันขึ้นมาใหม่ด้วยตนเองก่อนที่จะใช้วิธีการก่อนหน้านี้ เท่าที่ฉันสามารถบอกได้ (และหลังจากการตรวจสอบในหน้า man สำหรับฟังก์ชั่นที่น่าสนใจ แต่ค่อนข้างเพิกเฉยเช่นupdate( -u)) ไม่มีทางที่จะวางไฟล์ลงในไดเรคทอรีโดยพลการภายใน zipfile

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.