3

我正在尝试使用 yauzl 解压缩文件。但是,repo中的示例未显示如何解压缩到文件夹。它只是说:

readStream.pipe(somewhere);

有没有一种简单的方法可以将内容提取到文件夹中?

4

2 回答 2

0

嗨 :) 替换 'readStream.pipe(somewhere);' '//--------------------------------' 标签下的代码适用于我和repo 中的示例

import fs = require('fs');
const unzipper = require('unzipper');
const { pipeline, finished } = require('stream');

//--------------------

cons destDir = 'C:\MyPath'
const writer = fs.createWriteStream(path.join(destDir, entry.fileName));
readStream.pipe(writer);

await finished(readStream, (err) => {
    if (err) {
          console.error(' ### Streaming to writer failed: ', err);
    } else {
        console.log(' ### Streaming to writer succeded, file unzipped.');
    }
};

免责声明:我在学习Node/ts的开始!这对我有用,但由于某些原因可能是错误的。

于 2021-06-25T03:22:54.440 回答
0

这是一个承诺返回函数,它可以满足您的要求,但需要注意以下事项:

  • 我使用了mkdirp外部库。如果您对创建目录的方式更加小心,则可以将其删除。
  • 我没有测试在现有目录之上解压缩。
  • 拒绝之前的zipFile.close()陈述可能是不必要的。
import path = require('path');
import yauzl = require('yauzl');
import mkdirp = require('mkdirp');

/**
 * Example:
 * 
 * await unzip("./tim.zip", "./");
 * 
 * Will create directories:
 * 
 * ./tim.zip
 * ./tim
 * 
 * @param zipPath Path to zip file.
 * @param unzipToDir Path to the folder where the zip folder will be put.
 */
const unzip = (zipPath: string, unzipToDir: string) => {
    return new Promise<void>((resolve, reject) => {
        try {
            // Create folder if not exists
            mkdirp.sync(unzipToDir);

            // Same as example we open the zip.
            yauzl.open(zipPath, { lazyEntries: true }, (err, zipFile) => {
                if (err) {
                    zipFile.close();
                    reject(err);
                    return;
                }

                // This is the key. We start by reading the first entry.
                zipFile.readEntry();

                // Now for every entry, we will write a file or dir 
                // to disk. Then call zipFile.readEntry() again to
                // trigger the next cycle.
                zipFile.on('entry', (entry) => {
                    try {
                        // Directories
                        if (/\/$/.test(entry.fileName)) {
                            // Create the directory then read the next entry.
                            mkdirp.sync(path.join(unzipToDir, entry.fileName));
                            zipFile.readEntry();
                        }
                        // Files
                        else {
                            // Write the file to disk.
                            zipFile.openReadStream(entry, (readErr, readStream) => {
                                if (readErr) {
                                    zipFile.close();
                                    reject(readErr);
                                    return;
                                }

                                const file = fs.createWriteStream(path.join(unzipToDir, entry.fileName));
                                readStream.pipe(file);
                                file.on('finish', () => {
                                    // Wait until the file is finished writing, then read the next entry.
                                    // @ts-ignore: Typing for close() is wrong.
                                    file.close(() => {
                                        zipFile.readEntry();
                                    });

                                    file.on('error', (err) => {
                                        zipFile.close();
                                        reject(err);
                                    });
                            });
                        }
                    }
                    catch (e) {
                        zipFile.close();
                        reject(e);
                    }
                });
                zipFile.on('end', (err) => {
                    resolve();
                });
                zipFile.on('error', (err) => {
                    zipFile.close();
                    reject(err);
                });
            });
        }
        catch (e) {
            reject(e);
        }
    });
}
于 2021-10-27T23:15:50.100 回答