博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录
阅读量:2032 次
发布时间:2019-04-28

本文共 3912 字,大约阅读时间需要 13 分钟。

注意,前情提示:

本代码基于《Node.js(nodejs)对本地JSON文件进行增、删、改、查操作(轻车熟路)》
传送门

在/api/demo/文件夹下面创建copyFileOrFolder.js和deleteFileOrFolder.js

copyFileOrFolder.js代码内容 

const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router, path = global.SG.path;module.exports = global.SG.router;const copyFileOrFolerPath = "./json/demo/demo.json";//被复制的文件路径const pasteFileOrFolerPath = "./json/demoBak/demoBak.json";//粘贴文件路径// const copyFileOrFolerPath = "./json";//被复制的文件夹路径// const pasteFileOrFolerPath = "./temp";//粘贴文件夹路径const copyDir = (src, dst) => {    //读取目录中的所有文件/目录    fs.readdir(src, (err, paths) => {        if (err) throw err;        paths.forEach(path => {            const _src = src + "/" + path, _dst = dst + "/" + path;            let readable, writable;            fs.stat(_src, (err, st) => {                if (err) throw err;                if (st.isFile()) {//是文件                    readable = fs.createReadStream(_src);//创建读取流                    writable = fs.createWriteStream(_dst);//创建写入流                    readable.pipe(writable);//通过管道来传输流                } else {//是文件夹                    copyFolder(_src, _dst);//如果是目录则递归调用自身                }            });        });    });};//复制文件夹const copyFolder = (src, dst) => fs.existsSync(dst) ? copyDir(src, dst) : fs.mkdir(dst, () => copyDir(src, dst));const mkdirs = $g.dir.mkdirsByFilePath;//递归创建文件夹目录(基于文件路径)const resJson = (req, res) => {    fs.copyFile(copyFileOrFolerPath, pasteFileOrFolerPath, err => {        $g.json.res(req, res, `复制${copyFileOrFolerPath}${err ? "失败" : "成功"}`, {err, copyFileOrFolerPath, pasteFileOrFolerPath}, true);    });};//复制并且粘贴(覆盖无提示)文件(all方法支持POST、GET、PUT、PATCH、DELETE传参方式)router.all("/demo/copyFileOrFolder", (req, res) => {    if (fs.statSync(copyFileOrFolerPath).isFile()) {//是文件        mkdirs(pasteFileOrFolerPath, () => resJson(req, res));//复制文件    } else {//是文件夹        copyFolder(copyFileOrFolerPath, pasteFileOrFolerPath);//复制文件夹        $g.json.res(req, res, `复制${copyFileOrFolerPath}成功`, {err: null, copyFileOrFolerPath, pasteFileOrFolerPath}, true);    }});

 deleteFileOrFolder.js代码内容 

const $g = global.SG.$g, fs = global.SG.fs, router = global.SG.router, path = global.SG.path;module.exports = global.SG.router;// const deleteFileOrFolderPath = "./json/demoBak/demoBak.json";//被删除文件路径const deleteFileOrFolderPath = "./json/demoBak";//被删除文件夹路径const deleteFileOrFolderRecursive = (url, callback) => {    //判断给定的路径是否存在    fs.exists(url, exists => {        if (exists) {            if (fs.statSync(url).isFile()) {//是文件                fs.unlink(url, err => callback(err));            } else {//是文件夹                let __del = (url, callback) => {                    let files = [];                    //判断给定的路径是否存在                    files = fs.readdirSync(url);//返回文件和子目录的数组                    files.forEach((file, index) => {                        let curPath = path.join(url, file);                        if (fs.statSync(curPath).isDirectory()) {                            __del(curPath);//fs.statSync同步读取文件夹文件,如果是文件夹,在重复触发函数                        } else {                            fs.unlinkSync(curPath);                        }                    });                    fs.rmdirSync(url);//清除文件夹                    callback && callback();                };                __del(url, callback);            }        } else {            callback("亲,您提供的是一个子虚乌有的路径!");        }    });};const resJson = (req, res, err) => $g.json.res(req, res, `删除${deleteFileOrFolderPath}${err ? "失败" : "成功"}`, {err, deleteFileOrFolderPath}, !err);//删除文件or文件夹(覆盖无提示)文件(all方法支持POST、GET、PUT、PATCH、DELETE传参方式)router.all("/demo/deleteFileOrFolder", (req, res) => deleteFileOrFolderRecursive(deleteFileOrFolderPath, err => resJson(req, res, err)));

在index.js最后一行加入

app.use(API_PATH, require(`.${API_PATH}/demo/copyFileOrFolder`));//复制文件or文件夹app.use(API_PATH, require(`.${API_PATH}/demo/deleteFileOrFolder`));//删除文件or文件夹

运行

node index

 

转载地址:http://kdxaf.baihongyu.com/

你可能感兴趣的文章
数据库技术知识点总结之三——索引相关内容
查看>>
数据库技术知识点总结之四——乐观锁与悲观锁
查看>>
数据结构技术知识总结之一——二叉树
查看>>
Netty面试技术知识点总结
查看>>
设计模式总结之一——代理模式
查看>>
ZooKeeper 技术知识总结之一——Leader选举算法
查看>>
ZooKeeper 技术知识总结之二——ZK 惊群与脑裂
查看>>
Java并发技术总结之一——Java线程池
查看>>
Java并发技术总结之二——ThreadLocal
查看>>
Java并发技术总结之三——线程状态
查看>>
Java并发技术总结之四——CAS
查看>>
Java并发技术总结之五——AQS
查看>>
JVM技术总结之二——GC机制
查看>>
JVM技术总结之四——JVM内存结构
查看>>
Lucene基本知识入门
查看>>
Windows系统下通过PSCP传输文件至BeagleBone Black
查看>>
OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法
查看>>
背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法
查看>>
“王大锤の非诚勿扰” —— Spring IoC / DI 思想详述
查看>>
服务假死问题解决过程实记(三)——缓存问题优化
查看>>