Zipファイル(実際にはepubファイル)を持っています。ファイルをループして、ディスクに解凍せずに読み取る必要があります。
JSZip
と呼ばれるNode.jsライブラリを使用しようとしましたが、各ファイルのコンテンツはバッファのメモリに保存されており、バッファのコンテンツをデコードして文字列に戻そうとすると、返されたコンテンツを読み取ることができません
これが私が試したコードです:
const Zip = new JSZip();
// read a Zip file
fs.readFile(epubFile, function (err, data) {
if (err) throw err;
Zip.loadAsync(data).then(function (Zip) {
async.eachOf(Zip.files, function (content, fileName, callback) {
if (fileName.match(/json/)) {
var buf = content._data.compressedContent;
console.log(fileName);
console.log((new Buffer(buf)).toString('utf-8'));
}
callback();
}, function (err) {
if (err) {
console.log(err);
}
});
});
});
npm install unzip
https://www.npmjs.com/package/unzip
fs.createReadStream('path/to/archive.Zip')
.pipe(unzip.Parse())
.on('entry', function (entry) {
var fileName = entry.path;
var type = entry.type; // 'Directory' or 'File'
var size = entry.size;
if (fileName === "this IS the file I'm looking for") {
entry.pipe(fs.createWriteStream('output/path'));
} else {
entry.autodrain();
}
});
Unzipは放棄されたように見えるため、私は node-stream-Zip を使用してかなり成功しました。
npm install node-stream-Zip
ファイルの読み取りはすべて次のようになります。
const StreamZip = require('node-stream-Zip');
const Zip = new StreamZip({
file: 'archive.Zip',
storeEntries: true
});
Zip.on('ready', () => {
// Take a look at the files
console.log('Entries read: ' + Zip.entriesCount);
for (const entry of Object.values(Zip.entries())) {
const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
console.log(`Entry ${entry.name}: ${desc}`);
}
// Read a file in memory
let zipDotTxtContents = Zip.entryDataSync('path/inside/Zip.txt').toString('utf8');
console.log("The content of path/inside/Zip.txt is: " + zipDotTxtContents);
// Do not forget to close the file once you're done
Zip.close()
});