创建时间:2019-08-12

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

对文件夹(目录)的操作

以下代码有引用,复制文件相关方法

复制文件夹

使用了两种方式:

  1. child_process
  2. 递归的读取文件和文件夹再在指定地址创建

实现代码和释意如下:

/**
* @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()
}

可执行源码: https://github.com/NameHewei/node-koa/tree/master/moveFileOrFloder

欢迎交流 Github

node 删除和复制文件或文件夹的更多相关文章

  1. java文件和文件夹复制、删除、移动操作

    java文件和文件夹复制.删除.移动操作 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputS ...

  2. java删除文件夹 Java中实现复制文件或文件夹

    删除文件夹 import java.io.File; public class DeleteDir { /** * @param args */ public static void main(Str ...

  3. 用C#操作文件/文件夹(删除,复制,移动)

    操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 //使用file的静态方法进行复制 File.Copy(path, destpath); //使用File的静态 ...

  4. node.js 递归复制文件夹(附带文件过滤功能)

    1.简介: 很简单,写了一个node操作文件的小脚本,主要实现对目标文件夹中内容的复制.还顺带一个按照文件夹或者文件名过滤的功能. 2.应用场景 适合基于 node 环境的项目,项目打包的时候,配合 ...

  5. php文件及文件夹操作(创建、删除、移动、复制)

    <?php /** * 操纵文件类 * * 例子: * FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹 * FileUtil::cre ...

  6. C# 对文件与文件夹的操作包括删除、移动与复制

    在.Net中,对文件(File)和文件夹(Folder)的操作可以使用File类和Directory类,也可以使用FileInfo类和DirectoryInfo类.文件夹(Folder)是只在Wind ...

  7. php -- 文件操作类(文件或文件夹的:创建、删除、复制、移动)

    <? /** * 操纵文件类 * * 例子: * FileUtil::createDir('a/1/2/3'); 测试建立文件夹 建一个a/1/2/3文件夹 * FileUtil::create ...

  8. bat实现创建、复制、删除文件及文件夹

    1 建bat文件自动执行复制,删除命令. 例1:以下是复制cd.dll文件至windows\system32的bat文件内容: copy cd.dll %windir%\system32 例2:下面一 ...

  9. linux命令の删除文件和文件夹 复制粘贴文件和文件夹

    声明:此博文来自百度经验http://jingyan.baidu.com/article/642c9d34dcba80644a46f72d.html,谢谢分享! linux删除目录很简单,很多人还是习 ...

随机推荐

  1. c++ 函数知识点汇总

    c++ 函数知识点汇总 swap函数 交换两个数组元素 比如 swap(a[i],a[j]); 就是交换a[i] 和 a[j] 的值 strcpy() 复制一个数组元素的值到另一个数组元素里 strc ...

  2. Spring 注解编程之注解属性别名与覆盖

    前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...

  3. centos 7 安装docker,conflicts 异常

    [root@localhost html]# yum install docker-io 已加载插件:fastestmirror, langpacks Loading mirror speeds fr ...

  4. 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!

    网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...

  5. java调用新浪接口根据Ip查询所属地区

    import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import ...

  6. USACO-集合

    #include<cstdio> #include<iostream> using namespace std; long long f[400]; int main() { ...

  7. apache CXF Service 简单使用

    cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...

  8. Kotlin之var和val区别

    var 和 val 是Kotlin的两个声明变量的关键字, var声明的变量是一个可变的变量,而val声明的变量是一个只读的变量(类似于java中的final变量)

  9. C#3.0新增功能10 表达式树 01 简介

    连载目录    [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以 ...

  10. [PTA] L3-015 球队“食物链”

    原题链接 思路: 如果有环,则起点一定为"1".如果没有可以胜过"1"的,则无环. 根据W,L来建立图,用dfs从1节点遍历+回溯. 剪枝:dfs到某个子序列时 ...