How to unzip multiple files in the same folder with Gulp

女生的网名这么多〃 提交于 2019-12-23 10:16:02

问题


I'd like to unzip multiple zip files that are inside a single folder. Every unzipped file will be unpacked into a folder with the same name as the original zip file and added as a sub folder to the original folder containing the original zips.

Something like this:

parent(folder)
-a.zip
-b.zip
-c.zip

would become:

parent(folder)
-a(folder)
--a.zip contents here
-b(folder)
--b.zip contents here
-c(folder)
--c.zip contents here

I believe the code i have so far is a nice try but seems like it's executing asynchronously in the pipeline (i'm obviously not a Gulp expert). All the zip files are being looked at but only the last one seems to get all the content, and then some from other zips. Run it with one zip file in the folder and it works perfectly.

var zipsPath = 'src/';
var currentZipFileName;
function getZips(dir) {
    return fs.readdirSync(dir)
        .filter(function (file) {
            return file.indexOf(".zip") > 0;
        });
}
gulp.task('init', function (done) {
    var zips = getZips(zipsPath);

    var tasks = zips.map(function (zip) {
        console.log("zip", zip, path.join(zipsPath, zip));
        return gulp.src(path.join(zipsPath, zip), {
            base: '.'
        })
        .pipe(tap(function (file, t) {
            currentZipFileName = path.basename(file.path);
        }))
        .pipe(unzip({ keepEmpty : true }))
        .pipe(gulp.dest(function (path) {
            var folderName = currentZipFileName.replace(".zip", "");
            var destination = "./src/" + folderName;
            //console.log("destination", destination);
            return destination;
        }))
        .on('end', function() {
            console.log('done');
            done();
         });
    });

    return tasks;
});

Expected results: all the zip files should be unpacked. Actual results: most of the content is being dumped into the last zip file looked at. Thanks for the help


回答1:


Your problem lies here:

   .pipe(tap(function (file, t) {
        currentZipFileName = path.basename(file.path);
    }))

You are trying to set a variable in one pipe to use in a later pipe. That doesn't work, there are a few questions here about it, but it just doesn't work - your variable will probably have the last value in it when the gulp.dests start firing or undefined - I think it is based on unpredictable timing.

In any case you don't need to set that variable - you already have the value of the desired folder name in your zips.map(zip) {} the zip item. You can use that in the gulp.dest just fine.


gulp.task('init', function (done) {

  var zips = getZips(zipsPath);

  var tasks = zips.map(function (zip) {

    return gulp.src(zipsPath + "/" +  zip)

    // .pipe(tap(function (file, t) {
    //     currentZipFileName = path.basename(file.path);
    // }))

    .pipe(unzip({ keepEmpty: true }))

    .pipe(gulp.dest(path.join("src", path.basename(zip, ".zip"))))

    .on('end', function() {
        done();
     });
  });

  return tasks;
});

Also avoid using path.join in your gulp.src for the reasons stated here: gulpjs docs on glob separators:

The separator in a glob is always the / character - regardless of the operating system - even in Windows where the path separator is \\. In a glob, \\ is reserved as the escape character.

Avoid using Node's path methods, like path.join, to create globs. On Windows, it produces an invalid glob because Node uses \\ as the separator. Also avoid the __dirname global, __filename global, or process.cwd() for the same reasons.



来源:https://stackoverflow.com/questions/57246332/how-to-unzip-multiple-files-in-the-same-folder-with-gulp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!