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

nodejs 文件操作类的封装

hxing6419个月前 (04-03)nodejs3037

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

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)


使用方法:

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



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

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

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

分享给朋友:

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

mongodb数据备份和读取

下载mongodb数据工具,https://www.mongodb.com/try/download/database-tools,解压到目录中用命令行进入此目录,使用mongodump命令生成备份文件,例如备份本地test数据库到d:\db目录, 在db目录会生成一个test文件夹: mongod...

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

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

nodejs websocket 发送protoBuf数据到服务端

当使用Node.js进行WebSocket通信时,发送经过Protobuf编码的数据到服务端是一个常见的需求。在这篇博客中,我们将通过一个示例来演示如何实现这个功能。假设我们有一个WebSocket服务端,地址为ws://example.com/ws我要发送pb_http_frame中的Reques...

深入理解 Node.js 开发中的 Express 路由与中间件

在 Node.js 开发中,Express 是一个非常流行的框架,它提供了一种简洁而灵活的方式来构建 Web 应用程序。在 Express 中,路由和中间件是两个核心概念,它们在开发过程中起着重要的作用。本文将深入探讨 Express 路由和中间件的概念、使用方法以及...

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
2个月前 (11-04)

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

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

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

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

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

传奇sf
1个月前 (11-20)

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

114影院
4周前 (11-22)

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

发表评论

访客

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