Использовать gunzip для папки - PullRequest
0 голосов
/ 11 июля 2020

Верно, у меня есть папка, полная других папок, сжатых в файлы .gz. Внутри этих папок находятся текстовые файлы.

Я хочу иметь программу, которая просматривает эти текстовые файлы, чтобы увидеть, содержат ли они определенную строку c, но для этого мне нужно сначала распаковать их. Я не хочу начинать возиться с файлами (если только я не могу просто сделать их временно и удалить после), я просто хочу выполнять операции с содержимым папки .gz. Я пробовал zlib.Gunzip()._outBuffer.toString(), который дает нагрузку гиббери sh при использовании в сжатой папке.

Как мне действовать?

1 Ответ

0 голосов
/ 11 июля 2020

Недавно приходилось делать что-то очень похожее, вот что у меня сработало: в основном вы просто читаете файл в buffer, который затем можете передать функции gunzip. Это вернет другой буфер, в котором вы можете вызвать toString('utf8'), чтобы получить содержимое в виде строки, что именно то, что вам нужно:

const util = require('util');
let {gunzip} = require('zlib');
const fs = require('fs');
gunzip = util.promisify(gunzip);

async function getStringFromGzipFile(inputFilePath) {
    const sourceBuffer = await fs.promises.readFile(inputFilePath);
    return await gunzip(sourceBuffer);
}


(async () => {
   const stringContent = await getStringFromGzipFile('/path/to/file');
   console.log(stringContent);
})()

EDIT:

Если хотите Чтобы распаковать и извлечь каталог, вы можете использовать tar-fs, который будет извлекать содержимое в указанный каталог. После того, как вы закончите обработку файлов, вы можете просто удалить каталог. Вот как можно gunzip и извлечь .tar.gz:

function gunzipFolder(sourceDir, destination) {
    fs.createReadStream(sourceDir)
        .pipe(zlib.createGunzip())
        .pipe(tar.extract(destination));
}
...