nodejs压缩和解压缩文件夹(无中文乱码问题)

压缩

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('解压完成!');
  });
});

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值