nodejs 文件操作类的封装
最近做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')
})()