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

nodejs 文件操作类的封装

hxing6415个月前 (04-03)nodejs2602

最近做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')
})()



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

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

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

分享给朋友:

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

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 路由和中间件的概念、使用方法以及...

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

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

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

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

评论列表

发表评论

访客

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