node 删除和复制文件或文件夹
发布日期:2021-08-14 18:04:29 浏览次数:3 分类:技术文章

本文共 5321 字,大约阅读时间需要 17 分钟。

[toc]

创建时间:2019-08-12

注意:在win10,v10.16.1 环境运行无问题


首先引入相关包(会在使用处具体说明):

const fs = require('fs')const path = require('path')const child_process = require('child_process')const fsEx = require('fs-extra')/** * @des 该包为实验性API */const fsPromises = require('fs').promises复制代码

对文件的操作

复制文件

这里列出三种方式:

  1. 使用 writeFileSync 和 readFileSync 结合
  2. 使用 copyFileSync
  3. 使用promises的copyFile方法

其中的同步或异步方法可酌情更改,实现代码如下

/** * @param { copiedPath: String } (被复制文件的地址,相对地址) * @param { resultPath: String } (放置复制文件的地址,相对地址) */function copyFile(copiedPath, resultPath) {    copiedPath = path.join(__dirname, copiedPath)    resultPath = path.join(__dirname, resultPath)    try {        /**         * @des 方式一         */        // fs.writeFileSync(resultPath, fs.readFileSync(copiedPath))        /**         * @des 方式二         */        // fs.copyFileSync(copiedPath, resultPath)        console.log('success');    } catch (error) {        console.log(error);    }    /**     * @des 方式三     */    fsPromises.copyFile(copiedPath, resultPath)        .then(() => {            console.log('success');        }).catch((err) => {            console.log(err);        });}复制代码

删除文件

使用 unlinkSync 方法,实现代码如下

/** * @param { delPath:String } (需要删除文件的地址) * @param { direct:Boolean } (是否需要处理地址) */function deleteFile(delPath, direct) {    delPath = direct ? delPath : path.join(__dirname, delPath)    try {        /**         * @des 判断文件或文件夹是否存在         */        if (fs.existsSync(delPath)) {            fs.unlinkSync(delPath);        } else {            console.log('inexistence path:', delPath);        }    } catch (error) {        console.log('del error', error);    }}复制代码

对文件夹(目录)的操作

以下代码有引用,复制文件相关方法

复制文件夹

使用了两种方式:

  1. child_process
  2. 递归的读取文件和文件夹再在指定地址创建

实现代码和释意如下:

/** * @des 参数解释同上 */function copyFolder(copiedPath, resultPath, direct) {    if(!direct) {        copiedPath = path.join(__dirname, copiedPath)        resultPath = path.join(__dirname, resultPath)    }    function createDir (dirPath) {        fs.mkdirSync(dirPath)            }    if (fs.existsSync(copiedPath)) {        createDir(resultPath)        /**         * @des 方式一:利用子进程操作命令行方式         */        // child_process.spawn('cp', ['-r', copiedPath, resultPath])        /**         * @des 方式二:         */        const files = fs.readdirSync(copiedPath, { withFileTypes: true });        for (let i = 0; i < files.length; i++) {            const cf = files[i]            const ccp = path.join(copiedPath, cf.name)            const crp = path.join(resultPath, cf.name)              if (cf.isFile()) {                /**                 * @des 创建文件,使用流的形式可以读写大文件                 */                const readStream = fs.createReadStream(ccp)                const writeStream = fs.createWriteStream(crp)                readStream.pipe(writeStream)            } else {                try {                    /**                     * @des 判断读(R_OK | W_OK)写权限                     */                    fs.accessSync(path.join(crp, '..'), fs.constants.W_OK)                    copyFolder(ccp, crp, true)                } catch (error) {                    console.log('folder write error:', error);                }            }        }    } else {        console.log('do not exist path: ', copiedPath);    }}复制代码

删除文件夹

递归文件和文件夹,逐个删除

实现代码如下:

function deleteFolder(delPath) {    delPath = path.join(__dirname, delPath)    try {        if (fs.existsSync(delPath)) {            const delFn = function (address) {                const files = fs.readdirSync(address)                for (let i = 0; i < files.length; i++) {                    const dirPath = path.join(address, files[i])                    if (fs.statSync(dirPath).isDirectory()) {                        delFn(dirPath)                    } else {                        deleteFile(dirPath, true)                    }                }                /**                * @des 只能删空文件夹                */                fs.rmdirSync(address);            }            delFn(delPath);        } else {            console.log('do not exist: ', delPath);        }    } catch (error) {        console.log('del folder error', error);    }}复制代码

执行示例

目录结构

|- index.js(主要执行代码)|- a    |- a.txt    |- b.txt|- c    |- a.txt    |- b.txt|- p    |- a.txt    |- b.txt复制代码

根据传入的参数不同,执行相应的方法

/** * @des 获取命令行传递的参数 */const type = process.argv[2]function execute() {    /**     * @des 请根据不同的条件传递参数     */    if (type === 'copyFile') {        copyFile('./p/a.txt', './c/k.txt')    }    if (type === 'copyFolder') {        copyFolder('./p', './a')    }    if (type === 'delFile') {        deleteFile('./c/ss.txt')    }    if (type === 'delFolder') {        deleteFolder('./a')    }}execute()复制代码

命令行传参数

/** * @des 命令行传参 * 执行 node ./xxx/index.js 111 222 * 输出: * 0: C:\Program Files\nodejs\node.exe * 1: G:\GitHub\xxx\xxxx\index.js * 2: 111 * 3: 222 */process.argv.forEach((val, index) => {   console.log(`${index}: ${val}`);});复制代码

利用 fs-extra 实现

这是对fs相关方法的封装,使用更简单快捷

/** * @des fs-extra 包实现 * api参考: https://github.com/jprichardson/node-fs-extra */function fsExtra() {    async function copy() {        try {            await fsEx.copy(path.join(__dirname + '/p'), path.join(__dirname + '/d'))            console.log('success');        } catch (error) {            console.log(error);        }    }    copy()}复制代码

可执行源码:

欢迎交流

转载于:https://juejin.im/post/5d50c719e51d4561f777e188

转载地址:https://blog.csdn.net/weixin_30731305/article/details/100092394 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:便捷开发之mybatis逆向工程
下一篇:想成为web开发大神?那你应该从拥有良好的代码规范走起!(JavaScript篇 - 第一篇)...

发表评论

最新留言

不错!
[***.144.177.141]2024年11月18日 05时43分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

l310加完墨水后需要怎样设置_潜伏100个同行后,发现灯箱常用的画面输出方式是这4种!... 2019-06-17
opcache php 原理_PHP Opcache工作原理 2019-06-17
楷书书法规则_纯干货 | 史上最全硬笔书法入门常识!(果断转发) 2019-06-17
r矢量球坐标系旋度_基础篇1: CFD中的矢量 2019-06-17
matlab有趣表白程序_只工作,不上班——程序设计200,养生文案50,抖音文案200,方案设计... 2019-06-17
java实现多线程抢单_java学习中多线程同步和互斥有哪些实现方法 2019-06-17
大移动电子竞赛设计培训网_6大专题带你轻松备战|全国大学生电子设计竞赛 2019-06-17
mysql的NLJ_深入Mysql 2019-06-17
2012二级java真题_2012年计算机二级JAVA第七套模拟试题及答案详解 2019-06-17
java 2 2_Java 2.2 2019-06-17
java (int)object_在java上将int转换为Object 2019-06-17
java分发器_SpringMVC源码阅读:核心分发器DispatcherServlet 2019-06-17
java简易浏览器_简易浏览器代码(JAVA) 2019-06-17
ufo末日余晖java下载_幽浮:末日余晖 2019-06-17
efficient in Java_Efficient support for in-place metadata in Java software transactional memory 2019-06-17
java gui小程序_Java GUI 小程序 任意圆之间的带箭头的连线并可以存储 2019-06-17
java 更新word目录_java aspose.words 生成word目录和更新目录 2019-06-17
matlab数字信号处理实验报告,Matlab数字信号处理实验报告.pdf 2019-06-17
centos php memcache扩展,CentOS系统安装memcached和PHP的memcache扩展 2019-06-17
关于php的语法,关于PHP语法 2019-06-17