如何使用Gulp解压同一文件夹中的多个文件

如何使用Gulp解压同一文件夹中的多个文件,gulp,Gulp,我想解压一个文件夹中的多个zip文件。每一个解压后的文件都将解压到一个与原始zip文件同名的文件夹中,并作为子文件夹添加到包含原始zip的原始文件夹中 大概是这样的: parent(folder) -a.zip -b.zip -c.zip 将成为: parent(folder) -a(folder) --a.zip contents here -b(folder) --b.zip contents here -c(folder) --c.zip contents here 我相信到目前为止我

我想解压一个文件夹中的多个zip文件。每一个解压后的文件都将解压到一个与原始zip文件同名的文件夹中,并作为子文件夹添加到包含原始zip的原始文件夹中

大概是这样的:

parent(folder)
-a.zip
-b.zip
-c.zip
将成为:

parent(folder)
-a(folder)
--a.zip contents here
-b(folder)
--b.zip contents here
-c(folder)
--c.zip contents here
我相信到目前为止我的代码是一个很好的尝试,但它似乎是在管道中异步执行的(我显然不是一个吞咽专家)。所有的zip文件都在查看中,但似乎只有最后一个文件获得了所有内容,还有一些来自其他zip。使用文件夹中的一个zip文件运行它,它可以完美地工作

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;
});
预期结果:应解压缩所有zip文件。 实际结果:大部分内容被转储到最后查看的zip文件中。
感谢您的帮助

您的问题在于:

   .pipe(tap(function (file, t) {
        currentZipFileName = path.basename(file.path);
    }))
您正在尝试在一个管道中设置一个变量,以便在以后的管道中使用。这不起作用,这里有一些问题,但它不起作用-当gulp.dests启动或未定义时,您的变量可能包含最后一个值-我认为这是基于不可预测的时间

在任何情况下,您都不需要设置该变量-您的
zips.map(zip){}
zip项中已经有了所需文件夹名称的值。您可以在
gulp.dest
中使用它



此外,还应避免在
gulp.src
中使用
path.join
,原因如下:

glob中的分隔符始终是
/
字符-无论操作系统如何-即使在路径分隔符为
\\
的Windows中也是如此。在glob中,
\\
保留为转义字符

避免使用节点的路径方法(如path.join)来创建全局。在Windows上,由于节点使用
\\
作为分隔符,它会生成一个无效的glob。出于同样的原因,还应避免使用_dirname global、_filename global或process.cwd()


很好用!非常感谢你。我从来没有想到全局变量会这样把它扔掉,因为文件夹名称总是100%正确,并且有一些内容。那种有内容的部分快把我逼疯了。这完全解释了原因。我甚至没有注意到var在当时是完全没有意义的,在我添加.map之前,我假设我能够在一个进程(因此var)内循环,而该进程没有按预期工作,所以添加了.map,将管道视为一个进程,或者我认为是这样。很高兴能有另一双眼睛看到这一点。再次感谢。
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;
});