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

时间:2021-05-26

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

对文件的操作

复制文件

这里列出三种方式:

  • 使用 writeFileSync 和 readFileSync 结合
  • 使用 copyFileSync
  • 使用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…

    总结

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

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章