UNPKG

hudada-cli

Version:

专为程序员准备的本地文档搜索,快捷开发工具

3 lines (2 loc) 2.15 kB
#!/usr/bin/env node import o from"fs/promises";import{existsSync as e}from"fs";import r from"path";import t from"chalk";import s from"jszip";async function i(i,a){try{if(!i)return console.error(t.red("请提供要解压的文件路径")),void console.log(t.gray("用法: my unzip <源文件.zip> [目标目录]"));const c=r.isAbsolute(i)?i:r.resolve(process.cwd(),i),l=a?r.isAbsolute(a)?a:r.resolve(process.cwd(),a):r.join(process.cwd(),r.parse(c).name);if(!e(c))return void console.error(t.red(`源文件不存在: ${i}`));if(".zip"!==r.extname(c).toLowerCase())return void console.error(t.red("只支持解压 .zip 文件"));if(e(l))return void console.error(t.red(`目标目录已存在: ${l}`));console.log(t.cyan("准备解压文件:")),console.log(t.gray(`源文件: ${c}`)),console.log(t.gray(`目标目录: ${l}`));const f=await o.readFile(c),g=await s.loadAsync(f),d=Object.keys(g.files).length;console.log(t.gray(`\n压缩包中包含 ${d} 个文件/目录`)),await o.mkdir(l,{recursive:!0});let w=0;const y=Date.now();for(const[e,s]of Object.entries(g.files)){const i=r.join(l,e);w++;const n=Math.floor(w/d*100);if(process.stdout.write(`\r${t.gray(`解压进度: ${n}% (${w}/${d})`)}`),s.dir)await o.mkdir(i,{recursive:!0});else{await o.mkdir(r.dirname(i),{recursive:!0});const e=await s.async("nodebuffer");await o.writeFile(i,e)}}const p=await n(l),m=((Date.now()-y)/1e3).toFixed(1);console.log("\n"),console.log(t.green("✓ 解压完成")),console.log(t.gray("详细信息:")),console.log(t.gray(`解压文件数: ${d}`)),console.log(t.gray(`解压后大小: ${function(o){if(0===o)return"0 B";const e=["B","KB","MB","GB","TB"],r=Math.floor(Math.log(o)/Math.log(1024));return`${(o/Math.pow(1024,r)).toFixed(1)} ${e[r]}`}(p)}`)),console.log(t.gray(`耗时: ${m} 秒`)),console.log(t.gray(`输出目录: ${l}`))}catch(o){console.error(t.red("\n解压失败:"),o)}}async function n(e){const t=await o.stat(e);if(!t.isDirectory())return t.size;let s=0;const i=await o.readdir(e,{withFileTypes:!0});for(const t of i){const i=r.join(e,t.name);if(t.isDirectory())s+=await n(i);else{s+=(await o.stat(i)).size}}return s}export{i as unzipFile};