当前位置:首页 > javascript > nodejs > 正文内容

nodejs 文件操作类的封装

hxing6411年前 (2024-04-03)nodejs3197

最近做node项目,操作文件特别不方便,于是封装了工具类挺好用的,分享给大家

JavaScript
const fs = require('fs')
const path = require('path')
/**
 * 文件/目录操作封装工具
 */
class File {
constructor(fs, path) {
this.fs = fs
this.path = path
}
/**
 * 重命名文件/目录:可移动文件/目录到指定位置,如果是目录也包含其子文件
 */
rename(filePath, newFilePath) {
return new Promise((resolve, reject) => {
this.fs.rename(filePath, newFilePath, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 获取该目录的体积大小
 * @param {Object} dir 目录路径
 */
async getDirSize(dir) {
let size = 0
const info = await this.stat(dir)
//如果是文件
if (info.isFile()) {
size += info.size
} else {
//如果是目录
//获取目录下的文件
const files = await this.readdir(dir)
for (let i = 0; i < files.length; i++) {
size += await this.getDirSize(this.path.join(dir, files[i]))
}
}
return size
}
/**
 * 读取文件内容
 * @param {Object} filePath 文件路径
 */
readFile(filePath) {
return new Promise((resolve, reject) => {
this.fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
/**
 * 写入文本内容:覆盖原内容
 * @param {Object} filePath 文件路径
 * @param {Object} text 写入的文本内容
 */
writeFile(filePath, text) {
return new Promise((resolve, reject) => {
this.fs.writeFile(filePath, text, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 文件写入内容:追加
 * @param {Object} filePath 文件路径
 * @param {Object} text 写入的文本内容
 */
appendFile(filePath, text) {
return new Promise((resolve, reject) => {
this.fs.appendFile(filePath, text, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 拷贝文件
 * @param {Object} filePath 文件路径
 * @param {Object} copyFilePath 复制后的文件路径
 */
copyFile(filePath, copyFilePath) {
return new Promise((resolve, reject) => {
this.fs.copyFile(filePath, copyFilePath, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 打开文件
 * @param {Object} filePath 文件路径
 * @param {Object} mode 模式:r(读取模式,r+(读写模式),w(写入模式,如果文件不存在则创建),w+(读写模式,如果文件不存在则创建),wx(写入模式,如果文件不存在则返回失败),wx+(读写模式,如果文件不存在则返回失败),a(追加模式,如果文件不存在则创建),a+(读取追加模式,如果文件不存在则创建),ax(追加模式,如果文件不存在则返回失败),ax+(读取追加模式,如果文件不存在则返回失败)
 */
openFile(filePath, mode) {
return new Promise((resolve, reject) => {
this.fs.open(filePath, mode, (err, fd) => {
if (err) {
reject(err)
} else {
resolve(fd)
}
})
})
}
/**
 * 关闭文件
 * @param {Object} fd 打开文件时返回的文件标识符
 */
closeFile(fd) {
return new Promise((resolve, reject) => {
this.fs.close(fd, (fd, err) => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 查看文件或者目录的操作权限,可读写返回true,否则返回false,文件不存在也返回false
 * @param {Object} filePath 文件路径
 */
access(filePath) {
return new Promise(resolve => {
this.fs.access(filePath, this.fs.constants.R_OK | this.fs.constants.W_OK, err => {
if (err) {
resolve(false) //不可访问
} else {
resolve(true) //可读写
}
})
})
}
/**
 * 获取文件/目录信息
 * @param {Object} filePath 文件或者目录路径
 */
stat(filePath) {
return new Promise((resolve, reject) => {
this.fs.stat(filePath, (err, obj) => {
if (err) {
reject(err)
} else {
resolve(obj)
}
})
})
}
/**
 * 判断文件/目录是否存在
 * @param {Object} filePath 文件或者目录路径
 */
exist(filePath) {
return new Promise((resolve, reject) => {
this.fs.exists(filePath, exist => {
if (exist) {
resolve(true)
} else {
resolve(false)
}
})
})
}
/**
 * 创建目录
 * @param {Object} dir 目录路径
 */
mkdir(dir) {
return new Promise((resolve, reject) => {
this.fs.mkdir(dir, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 递归创建目录
 * @param {Object} dir 目录路径
 */
mkdirs(dir) {
return new Promise(async (resolve, reject) => {
this.exist(dir).then(exist => {
if (exist) {
//如果目录存在
resolve()
} else {
//目录不存在
this.mkdirs(this.path.dirname(dir))
.then(() => {
return this.mkdir(dir)
})
.then(() => {
resolve()
})
.catch(err => {
reject(err)
})
}
})
})
}
/**
 * 读取目录下的所有文件列表
 * @param {Object} dir 目录路径
 */
readdir(dir) {
return new Promise((resolve, reject) => {
this.fs.readdir(dir, (err, data) => {
if (err) {
reject(err)
} else {
resolve(data)
}
})
})
}
/**
 * 删除目录:只能删除空目录
 * @param {Object} dir 目录路径
 */
rmdir(dir) {
return new Promise((resolve, reject) => {
this.fs.rmdir(dir, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
/**
 * 递归删除目录:直接删除目录下的所有文件
 * @param {Object} dir
 */
async rmdirs(dir) {
const files = await this.readdir(dir)
if (files.length == 0) {
await this.rmdir(dir)
} else {
for (let i = 0; i < files.length; i++) {
const info = await this.stat(dir + this.path.sep + files[i])
if (info.isDirectory()) {
await this.rmdirs(dir + this.path.sep + files[i])
} else {
await this.rmFile(dir + this.path.sep + files[i])
}
}
this.rmdirs(dir)
}
}
/**
 * 删除文件
 * @param {Object} filePath 文件路径
 */
rmFile(filePath) {
return new Promise((resolve, reject) => {
this.fs.unlink(filePath, err => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
    /**
 * 获取文件后缀名
 * @param {Object} filePath 文件路径
 */
    getExt(filePath) {
        return path.extname(filePath).toLowerCase().slice(1); // 去除前面的点号
    }
    /**
 * 获取文件不含后缀名
 * @param {Object} filePath 文件路径
 */
    getName(filePath) {
        return path.parse(filePath).name;
    }
}
module.exports = new File(fs, path)


使用方法:

JavaScript
(async function () {
    const file = require('file.js')  // 引入后直接使用
    await file.rename('test.txt', 'text1.txt')
})()


扫描二维码推送至手机访问。

版权声明:本文由星星博客发布,如需转载请注明出处。

本文链接:https://xingxinghan.cn/?id=527

“nodejs 文件操作类的封装” 的相关文章

nodejs 解压文件,当文件名为中文名时会出现乱码

一开始我是使用compressing 去解压的,后面一直出现乱码,于是换了个解压的包 yauzl 具体实现步骤:安装npm install yauzl   2. 封装了个解压文件方法function unzip(zipFileName, output...

Node.js中的并发编程:利用事件循环实现高效多任务处理

在Node.js中,利用事件驱动的非阻塞I/O模型,我们可以轻松地实现并发编程,高效地处理多个任务。本文将介绍Node.js中的并发编程概念、常用的实现方式以及相关代码示例,并总结如何通过事件循环来实现高效的多任务处理。 一、并发编程概念...

深入理解Node.js进程管理

在Node.js中,进程管理是一个非常重要的话题,它涉及到如何创建、控制和监测进程,以及如何利用多核处理器。本文将深入探讨Node.js中的进程管理,并通过详细的代码示例帮助读者更好地理解。 1. 什么是进程? 首先,让我们了解一下...

npm安装时报错,出现 certificate has expired

最近使用npm安装工具屡屡报错,大致显示为:npm ERR! request to https://registry.npm.taobao.org/cnpm failed, reason: certificate has expired.从报错信息就可以知道是因为你之前设置的淘宝镜像已过期,解决方法...

评论列表

https://501h.com/heji/15184.html
5个月前 (11-04)

看到你的文章,我仿佛感受到了生活中的美好。

https://501h.com/fugu/17637.html
5个月前 (11-08)

你的文章让我感受到了正能量,非常棒!

www.4006400989.com
5个月前 (11-16)

你的文章让我感受到了生活的美好,谢谢! http://www.55baobei.com/8065BmugHl.html

传奇sf
传奇sf IP:湖北省
4个月前 (11-20)

原始传奇礼包怎么获取?:https://501h.com/jinbi/11025.html

114影院
114影院 IP:湖北省
4个月前 (11-22)

《驱邪》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/33257.html

新开传奇私服
新开传奇私服 IP:湖北省
3个月前 (01-03)

在什么情况下可以使用傲游浏览器的翻译功能?:https://www.tcqinfeng.com/news/5705.html

传奇私服
3个月前 (01-06)

陈小春代言的传奇:付费畅玩?:https://501h.com/jingpin/10606.html

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。