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 相关文章推荐
浅说js变量
May 25 Javascript
jquery选择器使用详解
Apr 08 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
js实现的早期滑动门菜单效果代码
Aug 27 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
简单总结JavaScript中的String字符串类型
May 26 Javascript
vue双向数据绑定原理探究(附demo)
Jan 17 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
Jul 24 Javascript
如何抽象一个Vue公共组件
Oct 17 Javascript
Vue.js图片预览插件使用详解
Aug 27 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
微信小程序3D轮播实现代码
Sep 19 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
YII路径的用法总结
2014/07/09 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
使用js画图之画切线
2015/01/12 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
js的三种继承方式详解
2017/01/21 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
通过python爬虫赚钱的方法
2019/01/29 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
英国女士家居服网站:hush
2017/08/09 全球购物
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
小学安全教育材料
2014/02/17 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
承诺书模板
2014/08/30 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL