Добавлен метод unTar
This commit is contained in:
@@ -2,10 +2,11 @@ const fs = require('fs-extra');
|
|||||||
const zlib = require('zlib');
|
const zlib = require('zlib');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const utils = require('./utils');
|
|
||||||
const extractZip = require('extract-zip');
|
const extractZip = require('extract-zip');
|
||||||
const unbzip2Stream = require('unbzip2-stream');
|
const unbzip2Stream = require('unbzip2-stream');
|
||||||
|
const tar = require('tar-fs')
|
||||||
|
|
||||||
|
const utils = require('./utils');
|
||||||
const FileDetector = require('./FileDetector');
|
const FileDetector = require('./FileDetector');
|
||||||
|
|
||||||
class FileDecompressor {
|
class FileDecompressor {
|
||||||
@@ -26,7 +27,7 @@ class FileDecompressor {
|
|||||||
files: []
|
files: []
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz')) {
|
if (!fileType || !(fileType.ext == 'zip' || fileType.ext == 'bz2' || fileType.ext == 'gz' || fileType.ext == 'tar')) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +96,43 @@ class FileDecompressor {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async unBz2(filename, outputDir) {
|
unBz2(filename, outputDir) {
|
||||||
|
return this.decompressByStream(unbzip2Stream(), filename, outputDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
unGz(filename, outputDir) {
|
||||||
|
return this.decompressByStream(zlib.createGunzip(), filename, outputDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
unTar(filename, outputDir) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const files = [];
|
||||||
|
|
||||||
|
const tarExtract = tar.extract(outputDir, {
|
||||||
|
map: (header) => {
|
||||||
|
files.push({path: header.name, size: header.size});
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
tarExtract.on('finish', () => {
|
||||||
|
resolve(files);
|
||||||
|
});
|
||||||
|
|
||||||
|
tarExtract.on('error', (err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
const inputStream = fs.createReadStream(filename);
|
||||||
|
inputStream.on('error', (err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
inputStream.pipe(tarExtract);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
decompressByStream(stream, filename, outputDir) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const file = {path: path.basename(filename)};
|
const file = {path: path.basename(filename)};
|
||||||
const outFilename = `${outputDir}/${file.path}`;
|
const outFilename = `${outputDir}/${file.path}`;
|
||||||
@@ -103,7 +140,7 @@ class FileDecompressor {
|
|||||||
const inputStream = fs.createReadStream(filename);
|
const inputStream = fs.createReadStream(filename);
|
||||||
const outputStream = fs.createWriteStream(outFilename);
|
const outputStream = fs.createWriteStream(outFilename);
|
||||||
|
|
||||||
outputStream.on('close', async() => {
|
outputStream.on('finish', async() => {
|
||||||
try {
|
try {
|
||||||
file.size = (await fs.stat(outFilename)).size;
|
file.size = (await fs.stat(outFilename)).size;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -120,15 +157,9 @@ class FileDecompressor {
|
|||||||
reject(err);
|
reject(err);
|
||||||
});
|
});
|
||||||
|
|
||||||
inputStream.pipe(unbzip2Stream()).pipe(outputStream);
|
inputStream.pipe(stream).pipe(outputStream);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async unGz(filename, outputDir) {
|
|
||||||
}
|
|
||||||
|
|
||||||
async unTar(filename, outputDir) {
|
|
||||||
}
|
|
||||||
|
|
||||||
async gzipBuffer(buf) {
|
async gzipBuffer(buf) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user