hudada-cli
Version:
专为程序员准备的本地文档搜索,快捷开发工具
3 lines (2 loc) • 2.21 kB
JavaScript
import o from"fs/promises";import{existsSync as r,createReadStream as e,createWriteStream as i}from"fs";import t from"path";import n from"chalk";async function s(e,i){try{if(!e||!i)return console.error(n.red("请提供源路径和目标路径")),void console.log(n.gray("用法: my cp <源路径> <目标路径>"));const l=t.isAbsolute(e)?e:t.resolve(process.cwd(),e),d=t.isAbsolute(i)?i:t.resolve(process.cwd(),i);if(!r(l))return void console.error(n.red(`源路径不存在: ${e}`));const g=(await o.stat(l)).isDirectory(),f=g?"目录":"文件";if(console.log(n.cyan(`准备复制${f}:`)),console.log(n.gray(`从: ${l}`)),console.log(n.gray(`到: ${d}`)),r(d))return void console.error(n.red(`目标路径已存在: ${i}`));try{g?await a(l,d):await c(l,d);const r=await o.stat(d);if(console.log(n.green("✓ 复制成功")),console.log(n.gray("详细信息:")),console.log(n.gray(`类型: ${f}`)),console.log(n.gray(`大小: ${function(o){if(0===o)return"0 B";const r=["B","KB","MB","GB","TB"],e=Math.floor(Math.log(o)/Math.log(1024));return`${(o/Math.pow(1024,e)).toFixed(1)} ${r[e]}`}(r.size)}`)),console.log(n.gray(`修改时间: ${s=r.mtime,s.toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}`)),g){const r=await async function(r){let e=0,i=0;async function n(r){const s=await o.readdir(r,{withFileTypes:!0});for(const o of s){const s=t.join(r,o.name);o.isDirectory()?(i++,await n(s)):e++}}return await n(r),{files:e,directories:i}}(d);console.log(n.gray(`包含: ${r.files} 个文件, ${r.directories} 个目录`))}}catch(o){throw"EACCES"===o.code?new Error(`没有权限复制: ${e}`):"ENOSPC"===o.code?new Error("磁盘空间不足"):o}}catch(o){console.error(n.red("复制失败:"),o)}var s}async function a(r,e){await o.mkdir(e,{recursive:!0});const i=await o.readdir(r,{withFileTypes:!0});for(const o of i){const i=t.join(r,o.name),n=t.join(e,o.name);o.isDirectory()?await a(i,n):await c(i,n)}}async function c(r,n){return await o.mkdir(t.dirname(n),{recursive:!0}),new Promise(((o,t)=>{const s=e(r),a=i(n);s.on("error",t),a.on("error",t),a.on("finish",o),s.pipe(a)}))}export{s as copyFileOrDirectory};