【问题标题】:How to unzip multiple files in the same folder with Gulp如何使用 Gulp 解压缩同一文件夹中的多个文件
【发布时间】:2019-07-29 01:45:16
【问题描述】:

我想解压缩单个文件夹中的多个 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

我相信我目前的代码是一个不错的尝试,但它似乎在管道中异步执行(我显然不是 Gulp 专家)。正在查看所有 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 文件中。 感谢您的帮助

【问题讨论】:

    标签: gulp


    【解决方案1】:

    你的问题在这里:

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

    您正试图在一个管道中设置一个变量以在以后的管道中使用。这不起作用,这里有一些关于它的问题,但它只是不起作用 - 当 gulp.dests 开始触发或未定义时,您的变量可能会有最后一个值 - 我认为它是基于不可预测的时机。

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


    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;
    });
    

    还要避免在您的gulp.src 中使用path.join,原因如下:gulpjs docs on glob separators

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

    避免使用 Node 的路径方法(例如 path.join)来创建 glob。在 Windows 上,它会产生一个无效的 glob,因为 Node 使用 \\ 作为分隔符。出于同样的原因,也要避免使用 __dirname global、__filename global 或 process.cwd()。

    【讨论】:

    • 完美运行!非常感谢。我永远不会猜到全局变量会像那样扔掉它,因为文件夹名称总是 100% 正确并且有点内容。那种有内容的部分让我发疯了。这完全解释了原因。也没有注意到 var 当时完全没有意义,在我添加 .map 之前,我认为我可以在一个进程(因此 var)中循环,但它没有按预期工作,所以添加了 .map将管道视为单个过程,或者我是这样。很高兴有另一双眼睛看到这一点。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多