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 相关文章推荐
JQuery开发的数独游戏代码
Oct 29 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
Jan 10 Javascript
关于include标签导致js路径找不到的问题分析及解决
Jul 09 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
JavaScript实战(原生range和自定义特效)简单实例
Aug 21 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
纯JS单页面赛车游戏制作代码分享
Mar 03 Javascript
最新Javascript程序员面试试题和解题方法
Nov 23 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
vue项目如何刷新当前页面的方法
May 18 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
Oct 11 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下统计用户在线时间的一种尝试
2010/08/26 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
javascript URL编码和解码使用说明
2010/04/12 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
jquery中动态效果小结
2010/12/16 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
Python科学计算包numpy用法实例详解
2018/02/08 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
职专应届生求职信
2013/11/16 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
一月红领巾广播稿
2014/02/11 职场文书
会计专业自我评价
2014/02/12 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
爱心捐款倡议书
2014/04/14 职场文书
孔繁森观后感
2015/06/10 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP