node删除、复制文件或文件夹示例代码


Posted in Javascript onAugust 13, 2019

注意:在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);
 }
}

对文件夹(目录)的操作

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

复制文件夹

使用了两种方式:

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

实现代码和释意如下:

/**
 * @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()
}

可执行源码: github.com/NameHewei/n…

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
js的touch事件的实际引用
Oct 13 Javascript
JS中捕获console.log()输出的方法
Apr 16 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
Oct 06 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
Aug 10 Javascript
学习Angular中作用域需要注意的坑
Aug 17 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 Javascript
实例讲解JavaScript预编译流程
Jan 24 Javascript
基于javascript实现日历功能原理及代码实例
May 07 Javascript
vue element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
如何用JavaScript实现一个数组惰性求值库
May 05 Javascript
vue实现下拉加载其实没那么复杂
Aug 13 #Javascript
vue中created和mounted的区别浅析
Aug 13 #Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 #Javascript
微信小程序使用npm包的方法步骤
Aug 13 #Javascript
Vue中的transition封装组件的实现方法
Aug 13 #Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
Aug 12 #Javascript
详解json串反转义(消除反斜杠)
Aug 12 #Javascript
You might like
php auth_http类库进行身份效验
2009/03/19 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
python调用shell的方法
2013/11/20 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
Python中的 enum 模块源码详析
2019/01/09 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
Java和Javasciprt的区别
2012/09/02 面试题
小班秋游活动方案
2014/02/22 职场文书
项目建议书范文
2014/05/12 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
青年教师听课心得体会
2016/01/15 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
详解Python魔法方法之描述符类
2021/05/26 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS