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扩展自写的 UI导航
Jan 13 Javascript
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 Javascript
jQuery的bind()方法使用详解
Jul 15 Javascript
百度地图给map添加右键菜单(判断是否为marker)
Mar 04 Javascript
js实现无缝滚动图
Feb 22 Javascript
微信小程序 出现47001 data format error原因解决办法
Mar 10 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
vue+web端仿微信网页版聊天室功能
Apr 30 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 Javascript
vue实现把接口单独存放在一个文件方式
Aug 13 Javascript
uniapp开发打包多端应用完整方法指南
Dec 24 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.MVC的模板标签系统(五)
2006/09/05 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
php支付宝APP支付功能
2020/07/29 PHP
[JS]点出统计器
2020/10/11 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python ljust rjust center输出
2008/09/06 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python操作MySQL数据库的方法
2018/06/20 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
详解python解压压缩包的五种方法
2019/07/05 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
学校个人对照检查材料
2014/08/26 职场文书
股东授权委托书范本
2014/09/13 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
《迟到》教学反思
2016/02/24 职场文书