压缩
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const inputFolderPath = path.join(__dirname, 'files/大名'); // 要压缩的文件夹路径
const outputFilePath = path.join(__dirname, 'files/filer.zip'); // 压缩后的输出文件路径
const output = fs.createWriteStream(outputFilePath);
const archive = archiver('zip', {
zlib: { level: 9 } // 设置压缩级别(可选)
});
output.on('close', () => {
console.log('文件夹压缩完成。');
});
output.on('error', (err) => {
console.error('压缩文件夹时出错:', err);
});
archive.pipe(output);
// 递归添加整个文件夹及其内容到压缩包
function addFolderToArchive(folderPath, archivePath) {
const items = fs.readdirSync(folderPath);
if (items.length === 0) {
// 添加一个空文件夹
archive.append(null, { name: archivePath + '/' });
return;
}
items.forEach((item) => {
const itemPath = path.join(folderPath, item);
const archiveItemPath = archivePath ? path.join(archivePath, item) : item;
if (fs.statSync(itemPath).isDirectory()) {
addFolderToArchive(itemPath, archiveItemPath);
} else {
archive.file(itemPath, { name: archiveItemPath });
}
});
}
addFolderToArchive(inputFolderPath, '');
archive.finalize();
解压
const fs = require('fs');
const path = require('path');
const yauzl = require('yauzl');
const iconv = require('iconv-lite');
const zipFilePath = path.join(__dirname, 'files/text.zip'); // 要解压的压缩文件路径
const outputDir = path.join(__dirname, '/'); // 解压后的输出文件夹路径
// 创建输出目录
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
// 打开 ZIP 文件
yauzl.open(zipFilePath, { decodeStrings: false, autoClose: false }, (err, zipfile) => {
if (err) throw err;
zipfile.on('entry', (entry) => {
const entryNameBuffer = Buffer.from(entry.fileName, 'binary');
const entryName = iconv.decode(entryNameBuffer, 'gbk'); // 假设文件名是使用 GBK 编码的
const entryOutputPath = path.join(outputDir, entryName);
if (/\/$/.test(entry.fileName)) {
// 创建子文件夹
if (!fs.existsSync(entryOutputPath)) {
fs.mkdirSync(entryOutputPath, { recursive: true });
}
} else {
// 解压文件
zipfile.openReadStream(entry, (err, readStream) => {
if (err) throw err;
readStream.pipe(fs.createWriteStream(entryOutputPath));
});
}
});
zipfile.on('end', () => {
console.log('解压完成!');
});
});