নোড.জেএস ব্যবহার করে একটি সম্পূর্ণ ডিরেক্টরি জিপ করা দরকার


114

নোড.জেএস ব্যবহার করে আমার একটি সম্পূর্ণ ডিরেক্টরি জিপ করা দরকার আমি বর্তমানে নোড-জিপ ব্যবহার করছি এবং প্রতিটি সময় প্রক্রিয়াটি চালিত হলে এটি একটি অবৈধ জিপ ফাইল তৈরি করে (যেমন আপনি এই গিথুব সমস্যাটি থেকে দেখতে পারেন )।

অন্য কোনও, আরও ভাল, নোড.জেএস বিকল্প রয়েছে যা আমাকে একটি ডিরেক্টরি জিপ আপ করতে দেয়?

সম্পাদনা: আমি আরকিভার ব্যবহার করে শেষ করেছি

writeZip = function(dir,name) {
var zip = new JSZip(),
    code = zip.folder(dir),
    output = zip.generate(),
    filename = ['jsd-',name,'.zip'].join('');

fs.writeFileSync(baseDir + filename, output);
console.log('creating ' + filename);
};

পরামিতিগুলির জন্য নমুনার মান:

dir = /tmp/jsd-<randomstring>/
name = <randomstring>

আপডেট: আমি যে বাস্তবায়নটি ব্যবহার করেছি সে সম্পর্কে জিজ্ঞাসাকারীদের জন্য, এখানে আমার ডাউনলোডারের একটি লিঙ্ক :


4
টুইটারে কেউ চাইল্ড_প্রসেস এপিআইয়ের পরামর্শ দিয়েছেন, এবং কেবলমাত্র সিস্টেমটিকে জিপ করুন: nodejs.org/api/child_process.html
২:12

4
আমি চাইল্ড_প্রসেস পদ্ধতির চেষ্টা করেছি। এটি দুটি ক্যাভেট পেয়েছে। 1) ইউনিক্স zipকমান্ডে জিপ করা ফাইলটিতে বর্তমান ওয়ার্কিং ডিরেক্টরিের সমস্ত প্যারেন্ট ফোল্ডার স্তরক্রম অন্তর্ভুক্ত। এটি আপনার পক্ষে ঠিক হতে পারে, এটি আমার পক্ষে ছিল না। চাইল্ড_প্রসেসে বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করা কোনওভাবে ফলাফলকে প্রভাবিত করে না। ২) এই সমস্যাটি কাটিয়ে ওঠার জন্য pushdআপনাকে ফোল্ডারে ঝাঁপ দিতে হবে যা আপনি জিপ করবেন এবং zip -r, তবে যেহেতু pushd ব্যাশে তৈরি হয়েছে এবং / বিন / শ নয়, আপনাকে / বিন / বাশও ব্যবহার করতে হবে। আমার নির্দিষ্ট ক্ষেত্রে এটি সম্ভব ছিল না। শুধু একটি মাথা আপ.
জনস্বে

4
@ জোজনোজবে নোডের child_process.execএপিআই আপনাকে সিডাব্লুডি নির্দিষ্ট করতে দেয় যেখানে আপনি কমান্ডটি চালাতে চান। সিডাব্লুডি পরিবর্তন করা মূল ফোল্ডার স্তরক্রমের সমস্যার সমাধান করে। এটি প্রয়োজন না হওয়ার বিষয়টিও ঠিক করে দেয় pushd। আমি পুরোপুরি চাইল্ড_প্রসেসের প্রস্তাব দিই।
গোবিন্দ রাই

4
stackoverflow.com/a/49970368/2757916 নেটিভ nodejs সমাধান child_process API ব্যবহার করে। কোড 2 লাইন। কোন তৃতীয় পক্ষের libs।
গোবিন্দ রাই

@ গোবিন্দরাই অনেক ধন্যবাদ!
জনোজবায়ে

উত্তর:


137

আমি আরচিভার লাইব ব্যবহার করে শেষ করেছি । দুর্দান্ত কাজ করে।

উদাহরণ

var file_system = require('fs');
var archiver = require('archiver');

var output = file_system.createWriteStream('target.zip');
var archive = archiver('zip');

output.on('close', function () {
    console.log(archive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.on('error', function(err){
    throw err;
});

archive.pipe(output);

// append files from a sub-directory, putting its contents at the root of archive
archive.directory(source_dir, false);

// append files from a sub-directory and naming it `new-subdir` within the archive
archive.directory('subdir/', 'new-subdir');

archive.finalize();

4
এটি কীভাবে করবেন তার কোনও উদাহরণ নেই বলে মনে হচ্ছে, আপনি যা করেছেন তা ভাগ করে নিতে কি আপত্তি আছে?
সিনেটেটা

4
দুর্ভাগ্যক্রমে, আর্কিভার এখন পর্যন্ত ফাইলের নামগুলিতে ইউনিকোড অক্ষর সমর্থন করে না। Github.com/ctalkington/node-archiver/issues/90 এ প্রতিবেদন করা হয়েছে
চোখের

4
আমি কীভাবে সমস্ত ফাইল এবং ডিরেক্টরিগুলি পুনরাবৃত্তভাবে (লুকানো ফাইল / ডিরেক্টরিগুলি) অন্তর্ভুক্ত করব?
আয়নিক বিজাউ

12
আর্কিভার এটিকে এখন আরও সহজ করে তোলে। বাল্ক () পদ্ধতিটি ব্যবহার না করে আপনি এখন ডিরেক্টরি ব্যবহার করতে পারেন (): npmjs.com/package/archiver#directory-dirpath-destpath-data
জোশ ফিল্ডম্যান

14
.bulk
অবচয়

55

আমি নতুন কিছু দেখানোর ভান করি না, যারা তাদের কোডে (আমার মত) প্রতিশ্রুতি ফাংশন ব্যবহার করতে পছন্দ করেন তাদের জন্য উপরের সমাধানগুলি সংক্ষিপ্ত করতে চাই।

const archiver = require('archiver');

/**
 * @param {String} source
 * @param {String} out
 * @returns {Promise}
 */
function zipDirectory(source, out) {
  const archive = archiver('zip', { zlib: { level: 9 }});
  const stream = fs.createWriteStream(out);

  return new Promise((resolve, reject) => {
    archive
      .directory(source, false)
      .on('error', err => reject(err))
      .pipe(stream)
    ;

    stream.on('close', () => resolve());
    archive.finalize();
  });
}

আশা করি এটি কাউকে সহায়তা করবে;)


এখানে "আউট" ঠিক কী? আমি ধরে নিই উত্সটি হ'ল ডিরেক্টরিটির পথ
ড্রিমস

@ তারুন পূর্ণ জিপের পথ যেমন: / ব্যবহারকারীর / মাইপিসি
মাইদির

জিপ ফাইলটি আনজিপ করা যায় না। অপারেশনটির অনুমতি নেই
জেক

@ একজ_03 দয়া করে নিশ্চিত করুন যে নির্দিষ্ট ডিরেক্টরিতে আপনার যথেষ্ট অধিকার রয়েছে
ডিডিমিত্রোগ্লো

4
@ ডিডিমিত্রোগ্লো সব ভাল all এটা সোর্স দির ইস্যু ছিল। ধন্যবাদ :)
জেক

19

child_processএটি সম্পাদন করতে নোডের নেটিভ এপি ব্যবহার করুন ।

তৃতীয় পক্ষের libs প্রয়োজন নেই। কোড দুটি লাইন।

const child_process = require("child_process");
child_process.execSync(`zip -r DESIRED_NAME_OF_ZIP_FILE_HERE *`, {
  cwd: PATH_TO_FOLDER_YOU_WANT_ZIPPED_HERE
});

আমি সিঙ্ক্রোনাস এপিআই ব্যবহার করছি। আপনার child_process.exec(path, options, callback)অ্যাসিঙ্ক প্রয়োজন হলে আপনি ব্যবহার করতে পারেন । আপনার অনুরোধগুলি আরও সরিয়ে দেওয়ার জন্য সিডাব্লুডি নির্দিষ্টকরণের চেয়ে আরও অনেকগুলি বিকল্প রয়েছে। দেখুন Exec / execSync ডক্স।


দয়া করে নোট করুন: এই উদাহরণটি ধরে নিয়েছে যে আপনি আপনার সিস্টেমে জিপ ইউটিলিটি ইনস্টল করেছেন (এটি কমপক্ষে ওএসএক্সের সাথে আসে)। কিছু অপারেটিং সিস্টেমে ইউটিলিটি ইনস্টল না থাকতে পারে (যেমন, এডাব্লুএস ল্যাম্বদা রানটাইম নেই)। সেক্ষেত্রে, আপনি সহজেই এখানে জিপ ইউটিলিটি বাইনারি পেতে পারেন এবং আপনার অ্যাপ্লিকেশন উত্স কোডের সাথে এটি প্যাকেজ করতে পারেন (এডাব্লুএস লাম্বদা জন্য আপনি এটি একটি ল্যাম্বদা স্তরতেও প্যাকেজ করতে পারেন), অথবা আপনাকে তৃতীয় পক্ষের মডিউলটি ব্যবহার করতে হবে (যার মধ্যে এনপিএমে প্রচুর পরিমাণ রয়েছে)। আমি পূর্বের পদ্ধতির পছন্দ করি, কারণ জিপ ইউটিলিটি কয়েক দশক ধরে চেষ্টা করা এবং পরীক্ষিত।


10
দুর্ভাগ্যক্রমে কেবলমাত্র এমন সিস্টেমে কাজ করে zip
janpio

4
কেবলমাত্র আমার প্রকল্পের কয়েক ডজন বাহ্যিক গ্রন্থাগার এড়ানোর স্বার্থে এই সমাধানটির জন্য গিয়েছিলেন
ইজেজেদো

এটি বোধগম্য হয়, তবে আমি যদি ভুল না হয়ে থাকি তবে এটি আবার উইন্ডোজ ব্যবহারকারীদের জন্য স্ক্রু করছে। উইন্ডোজ ব্যবহারকারীদের সম্পর্কে চিন্তা করুন!
ম্যাথিজস সেগারস

@ ম্যাথিজসিজার্স হা হা! আমি বাইনারিটিতে একটি লিঙ্ক অন্তর্ভুক্ত করেছি তাই উইন্ডোজ ব্যবহারকারীরাও এটি পেতে পারেন! :)
গোবিন্দ রায়

কম্পিউটার ডিরেক্টরি না করে কোনও প্রকল্পের মধ্যে ডিরেক্টরিতে কাজ করার কী উপায় আছে?
ম্যাট ক্রোক

13

Archive.bulkএখন হ্রাস করা হয়েছে, এর জন্য নতুন যে পদ্ধতিটি ব্যবহার করা হবে তা গ্লোবাল :

var fileName =   'zipOutput.zip'
var fileOutput = fs.createWriteStream(fileName);

fileOutput.on('close', function () {
    console.log(archive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

archive.pipe(fileOutput);
archive.glob("../dist/**/*"); //some glob pattern here
archive.glob("../dist/.htaccess"); //another glob pattern
// add as many as you like
archive.on('error', function(err){
    throw err;
});
archive.finalize();

4
এই সম্পর্কে ভাবছিলাম, তারা বলেছিল যে বাল্ককে অবমূল্যায়ন করা হয়েছিল তবে পরিবর্তে কোন ফাংশনটি ব্যবহার করা উচিত তা প্রস্তাব দেয়নি।
jarodsmk

4
আপনি "উত্স" ডিরেক্টরিটি কীভাবে নির্দিষ্ট করবেন?
স্বপ্ন 11

নীচের পদ্ধতির একবার ব্যবহার করে দেখুন: jsonworld.wordpress.com/2019/09/07/…
সনি কুমারী

2020: সংরক্ষণাগার। ডিরেক্টরি () অনেক সহজ!
ওহাদআর

9

সমস্ত ফাইল এবং ডিরেক্টরি অন্তর্ভুক্ত করতে:

archive.bulk([
  {
    expand: true,
    cwd: "temp/freewheel-bvi-120",
    src: ["**/*"],
    dot: true
  }
]);

এটি নীচে নোড-গ্লোব ( https://github.com/isaacs/node-glob ) ব্যবহার করে , সুতরাং এর সাথে সামঞ্জস্যপূর্ণ যে কোনও মিল খুঁজে পাবে।


.বুলক অবহেলা করা হয়েছে
মোহামাদ হামৌদ

9

এটি অন্য একটি লাইব্রেরি যা ফোল্ডারে এক লাইনে জিপ করে : জিপ-লোকাল

var zipper = require('zip-local');

zipper.sync.zip("./hello/world/").compress().save("pack.zip");

4
ইন্টারনেটে উপলভ্য বা উপরে উল্লিখিত ডজনখানেক অন্যের মতো, যাদুকরের মতো কাজ করেছেন, যা সর্বদা আমার জন্য 'জিরো বাইটস' ফাইল তৈরি করে
সের্গে প্লেশাকভ

4

প্রতিক্রিয়া অবজেক্টে ফলাফলটি পাইপ করতে (স্থানীয়ভাবে স্টোর করার পরিবর্তে জিপটি ডাউনলোড করার প্রয়োজন রয়েছে এমন পরিস্থিতিতে)

 archive.pipe(res);

ডিরেক্টরিটির সামগ্রীটি অ্যাক্সেস করার জন্য স্যামের ইঙ্গিতগুলি আমার পক্ষে কাজ করেছিল।

src: ["**/*"]

3

অ্যাডম-জিপটিতে কেবল বিদ্যমান সংরক্ষণাগারটি https://github.com/cthackers/adm-zip/issues/64 সংকলন করার পাশাপাশি বাইনারি ফাইলগুলি সংকুচিত করার ক্ষেত্রে দুর্নীতি রয়েছে।

আমি নোড-জিপ https://github.com/daraosn/node-zip/issues/4 দিয়ে সংকোচনের দুর্নীতির সমস্যার মধ্যেও চলে এসেছি

নোড-আর্কিভার হ'ল একমাত্র যা সঙ্কুচিত করতে ভাল কাজ করে বলে মনে হচ্ছে তবে এর কোনও সঙ্কোচন কার্যকারিতা নেই।


4
আপনি কোন নোড-আর্চিভার সম্পর্কে কথা বলছেন? : github.com/archiverjs/node-archiver; github.com/richardbolt/node-archiver
বাইফোবে

@ ফিরিয়ান তিনি আরচিভার বলেন নি, তিনি বলেছেন অ্যাডম-জিপ।
ফ্রান্সিস পেল্যান্ড

4
@ ফ্রেঞ্চিস্পেল্যান্ড উম্ম, শেষ বাক্যে তিনি লিখেছিলেন " নোড-আর্কিভারই কেবল কাজ করে বলে মনে হয় " - এটাই আমি উল্লেখ করছি।
বাইফোব

আমার মনে হয় তিনি npmjs.com/package/archiver
OhadR

2

আমি এই ছোট লাইব্রেরিটি পেয়েছি যা আপনার যা প্রয়োজন তা অন্তর্ভুক্ত করে।

npm install zip-a-folder

const zip-a-folder = require('zip-a-folder');
await zip-a-folder.zip('/path/to/the/folder', '/path/to/archive.zip');

https://www.npmjs.com/package/zip-a-folder


জিপ ফোল্ডারটি তৈরি করতে পরামিতিগুলি যুক্ত করা কি সম্ভব? সংকুচিত স্তর এবং আকারের মত যদি তাই কিভাবে?
ট্রাং ডি

1

যেহেতু archiverদীর্ঘ সময়ের জন্য ওয়েবপ্যাকের নতুন সংস্করণটির সাথে সামঞ্জস্যপূর্ণ নয়, তাই আমি জিপ-লিব ব্যবহার করার পরামর্শ দিই ।

var zl = require("zip-lib");

zl.archiveFolder("path/to/folder", "path/to/target.zip").then(function () {
    console.log("done");
}, function (err) {
    console.log(err);
});

0

আপনি একটি সহজ উপায়ে চেষ্টা করতে পারেন:

ইনস্টল করুন zip-dir:

npm install zip-dir

এবং এটি ব্যবহার করুন

var zipdir = require('zip-dir');

let foldername =  src_path.split('/').pop() 
    zipdir(<<src_path>>, { saveTo: 'demo.zip' }, function (err, buffer) {

    });

জিপ ফোল্ডার তৈরি করতে পরামিতি যুক্ত করা কি সম্ভব? সংকুচিত স্তর এবং আকারের মত যদি তাই কিভাবে?
ট্রাং ডি

0

আমি জেএসজিপ অনুকরণ করার জন্য আর্চিভার মোড়ানোর কাজ শেষ করেছি, কারণ আমার প্রকল্পের মাধ্যমে রিফ্যাক্টরিং খুব বেশি চেষ্টা করবে। আমি বুঝতে পেরেছি আর্চিভার সেরা পছন্দ নাও হতে পারে তবে আপনি এখানে যান।

// USAGE:
const zip=JSZipStream.to(myFileLocation)
    .onDone(()=>{})
    .onError(()=>{});

zip.file('something.txt','My content');
zip.folder('myfolder').file('something-inFolder.txt','My content');
zip.finalize();

// NodeJS file content:
    var fs = require('fs');
    var path = require('path');
    var archiver = require('archiver');

  function zipper(archive, settings) {
    return {
        output: null,
        streamToFile(dir) {
            const output = fs.createWriteStream(dir);
            this.output = output;
            archive.pipe(output);

            return this;
        },
        file(location, content) {
            if (settings.location) {
                location = path.join(settings.location, location);
            }
            archive.append(content, { name: location });
            return this;
        },
        folder(location) {
            if (settings.location) {
                location = path.join(settings.location, location);
            }
            return zipper(archive, { location: location });
        },
        finalize() {
            archive.finalize();
            return this;
        },
        onDone(method) {
            this.output.on('close', method);
            return this;
        },
        onError(method) {
            this.output.on('error', method);
            return this;
        }
    };
}

exports.JSzipStream = {
    to(destination) {
        console.log('stream to',destination)
        const archive = archiver('zip', {
            zlib: { level: 9 } // Sets the compression level.
        });
        return zipper(archive, {}).streamToFile(destination);
    }
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.