Thêm một tệp vào một đường dẫn khác trong một tệp zip


9

Tôi có một tập tin được đặt trong thư mục sau:

folder_A/another_folder_A/file_to_add.xml

Bây giờ, những gì tôi muốn làm chỉ đơn giản là thêm tệp vào một thư mục trong kho lưu trữ zip hiện có.

Ví dụ: đây là nội dung zip của tôi:

my_zip.zip/folder_B/another_folder_B

Làm thế nào tôi có thể thêm file_to_add.xmlvào another_folder_B?

my_zip.zip/folder_B/another_folder_B/file_to_add.xml

Tôi không muốn tạo các thư mục có cùng tên và thêm chúng. Có một lệnh cho phép tôi làm điều đó?

Câu trả lời:


2

Không biết cách để làm điều này bằng 7zhoặc zipcông cụ trực tiếp. Nhưng, đoán hầu hết các thư viện như perl, python vv đều có một zipmô-đun. Bạn không thể, tuy nhiên làm điều đó trong Bash.


Đây là một ví dụ đơn giản trong PHP:

Trường hợp thử nghiệm:

$ 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

Sử dụng:

./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.

Mã số:

(Không được mã hóa PHP trong một thời gian dài. Dù sao đi nữa, mã này chỉ có ý nghĩa như một ví dụ được mở rộng hoặc khác.)

#!/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

Nếu các thư mục của bạn có cùng tên bên trong và bên ngoài zipfile, điều đó khá dễ dàng. Trong thư mục chứa folder, bạn có thể làm zip my_zip.zip folder -r.

Nếu cấu trúc của bạn bên trong và bên ngoài zipfile không hoàn toàn giống nhau, bạn sẽ phải tạo lại thủ công trước khi áp dụng phương pháp trước đó. Theo như tôi có thể nói (và sau khi kiểm tra trong trang man cho các hàm thú vị nhưng bị bỏ qua như update( -u)), không có cách nào để đặt một tệp vào một thư mục tùy ý bên trong một tệp zipfile.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.