UNPKG

hudada-cli

Version:

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

3 lines (2 loc) 2.19 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,l){try{if(!i)return console.error(t.red("请提供要压缩的文件或目录路径")),void console.log(t.gray("用法: my zip <源路径> [目标路径]"));const f=r.isAbsolute(i)?i:r.resolve(process.cwd(),i),g=l?r.isAbsolute(l)?l:r.resolve(process.cwd(),l):`${f}.zip`;if(!e(f))return void console.error(t.red(`源路径不存在: ${i}`));if(e(g))return void console.error(t.red(`目标文件已存在: ${g}`));const y=(await o.stat(f)).isDirectory(),w=y?"目录":"文件";console.log(t.cyan(`准备压缩${w}:`)),console.log(t.gray(`源: ${f}`)),console.log(t.gray(`目标: ${g}`));const d=new s;if(y)await n(d,f,"");else{const e=await o.readFile(f);d.file(r.basename(f),e)}console.log(t.gray("\n正在压缩..."));const p=await d.generateAsync({type:"nodebuffer",compression:"DEFLATE",compressionOptions:{level:9}},(o=>{const e=Math.floor(o.percent);process.stdout.write(`\r${t.gray(`进度: ${e}%`)}`)}));await o.mkdir(r.dirname(g),{recursive:!0}),await o.writeFile(g,p);const m=await a(f),u=(await o.stat(g)).size,$=(100*(1-u/m)).toFixed(1);console.log("\n"),console.log(t.green("✓ 压缩完成")),console.log(t.gray("详细信息:")),console.log(t.gray(`原始大小: ${c(m)}`)),console.log(t.gray(`压缩后大小: ${c(u)}`)),console.log(t.gray(`压缩率: ${$}%`)),console.log(t.gray(`输出文件: ${g}`))}catch(o){console.error(t.red("\n压缩失败:"),o)}}async function n(e,t,s){const i=await o.readdir(t,{withFileTypes:!0});for(const a of i){const i=r.join(t,a.name),c=r.join(s,a.name);if(a.isDirectory()){e.folder(c)&&await n(e,i,c)}else{const r=await o.readFile(i);e.file(c,r)}}}async function a(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 a(i);else{s+=(await o.stat(i)).size}}return s}function c(o){if(0===o)return"0 B";const e=Math.floor(Math.log(o)/Math.log(1024));return`${(o/Math.pow(1024,e)).toFixed(1)} ${["B","KB","MB","GB","TB"][e]}`}export{i as zipFileOrDirectory};