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 相关文章推荐
input按钮的事件处理大全
Dec 10 Javascript
javascript 随机展示头像实现代码
Dec 06 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
JS获取农历日期具体实例
Nov 14 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
Feb 02 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
探索Vue.js component内容实现
Nov 03 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
简单实现bootstrap导航效果
Feb 07 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php发送post请求的三种方法
2014/02/11 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python统计cpu利用率的方法
2015/06/02 Python
python基于ID3思想的决策树
2018/01/03 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
全国优秀辅导员事迹材料
2014/05/14 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
大学生就业求职信
2014/06/12 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
初中班主任工作随笔
2015/08/15 职场文书
企业团队精神心得体会
2016/01/19 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
python 中的jieba分词库
2021/11/23 Python