एक ज़िप फ़ाइल में एक अलग पथ के लिए एक फ़ाइल जोड़ें


9

मेरे पास एक फाइल है जिसे निम्नलिखित निर्देशिका में रखा गया है:

folder_A/another_folder_A/file_to_add.xml

अब, मैं जो करना चाहता हूं, वह फ़ाइल को मौजूदा ज़िप संग्रह में एक फ़ोल्डर में जोड़ना है।

उदाहरण के लिए यह मेरी ज़िप सामग्री है:

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औजारों से करने का कोई तरीका नहीं जानते । लेकिन, अनुमान लगाएं कि अधिकांश पुस्तकालयों जैसे पर्ल, पायथन आदि में एक zipमॉड्यूल है। हालांकि आप इसे बाश में नहीं कर सकते।


यहाँ 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 के अंदर और बाहर समान है, तो यह बहुत आसान है। युक्त निर्देशिका में folder, आप कर सकते हैं zip my_zip.zip folder -r

यदि जिपफाइल के अंदर और बाहर आपकी संरचना बिल्कुल समान नहीं है, तो आपको पिछली विधि को लागू करने से पहले इसे मैन्युअल रूप से फिर से बनाना होगा। जहाँ तक मैं बता सकता हूँ (और दिलचस्प पेज के लिए मैन पेज में जाँच के बाद अभी तक की तरह update( -u)) को अनदेखा किया गया कार्य ( जैसे ) एक फ़ाइल को एक zipfile के अंदर एक मनमाना निर्देशिका में डालने का कोई तरीका नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.