侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

前端  /  管理员 发布于 5年前   728

注意:在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…

总结

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

您可能感兴趣的文章:

  • 在Node.js中实现文件复制的方法和实例
  • Nodejs如何复制文件
  • Nodejs 复制文件/文件夹的方法
  • Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
  • Node.js复制文件的方法示例
  • nodeJS删除文件方法示例
  • nodejs判断文件、文件夹是否存在及删除的方法
  • Node.JS循环删除非空文件夹及子目录下的所有文件
  • Linux下使用inode删除指定文件方法示例


  • 上一条:
    electron实现静默打印的示例代码
    下一条:
    详解使用JWT实现单点登录(完全跨域方案)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客