Сжатие текстового файла, содержащего символы новой строки в Node.js, приводит к повреждению файла gzip - PullRequest
0 голосов
/ 18 апреля 2020

Следуя приведенному ниже примеру тривиального кода, скопированному непосредственно из https://nodejs.org/api/zlib.html#zlib_zlib, файл gzip будет поврежден, если входной текстовый файл содержит символы новой строки!

При распаковке полученного файла из терминал, использующий unzip input.txt.gz Я получаю следующую ошибку (разархивирование двойным щелчком по файлу в Finder приведет к аналогичной ошибке):

Подпись конца центрального каталога не найдена. Либо этот файл не является zip-файлом, либо он представляет собой один диск из многочастного архива. В последнем случае центральный каталог и комментарий к zipfile будут найдены на последнем диске (дисках) этого архива.

Чего мне не хватает? Конечно, вы должны быть в состоянии сжимать текстовые файлы, содержащие символы новой строки?!

Я использую Ma c OS 10.15.3 с узлом 12.14.1.

input.txt (попытался вставить завершающий символ новой строки, но он не делает различий):

hello
world

Node.js код:

const { createGzip } = require('zlib');
const { pipeline } = require('stream');
const {
  createReadStream,
  createWriteStream
} = require('fs');

const gzip = createGzip();
const source = createReadStream('input.txt');
const destination = createWriteStream('input.txt.gz');

pipeline(source, gzip, destination, (err) => {
  if (err) {
    console.error('An error occurred:', err);
    process.exitCode = 1;
  }
});

1 Ответ

2 голосов
/ 18 апреля 2020

Gzip не ZIP. Gzip сжимает только один поток; ZIP - это формат архива, который упаковывает несколько файлов в один архив, и каждый файл может быть сжат другим способом или не совсем.

Чтобы распаковать что-то, что вы сжали с помощью Gzip, используйте gunzip инструмент.

...