nodejs 文件操作類(lèi)的封裝
最近做node項(xiàng)目,操作文件特別不方便,于是封裝了工具類(lèi)挺好用的,分享給大家
const fs = require('fs') const path = require('path') /** * 文件/目錄操作封裝工具 */ class File { constructor(fs, path) { this.fs = fs this.path = path } /** * 重命名文件/目錄:可移動(dòng)文件/目錄到指定位置,如果是目錄也包含其子文件 */ 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 } /** * 讀取文件內(nèi)容 * @param {Object} filePath 文件路徑 */ readFile(filePath) { return new Promise((resolve, reject) => { this.fs.readFile(filePath, 'utf8', (err, data) => { if (err) { reject(err) } else { resolve(data) } }) }) } /** * 寫(xiě)入文本內(nèi)容:覆蓋原內(nèi)容 * @param {Object} filePath 文件路徑 * @param {Object} text 寫(xiě)入的文本內(nèi)容 */ writeFile(filePath, text) { return new Promise((resolve, reject) => { this.fs.writeFile(filePath, text, err => { if (err) { reject(err) } else { resolve() } }) }) } /** * 文件寫(xiě)入內(nèi)容:追加 * @param {Object} filePath 文件路徑 * @param {Object} text 寫(xiě)入的文本內(nèi)容 */ 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 復(fù)制后的文件路徑 */ copyFile(filePath, copyFilePath) { return new Promise((resolve, reject) => { this.fs.copyFile(filePath, copyFilePath, err => { if (err) { reject(err) } else { resolve() } }) }) } /** * 打開(kāi)文件 * @param {Object} filePath 文件路徑 * @param {Object} mode 模式:r(讀取模式,r+(讀寫(xiě)模式),w(寫(xiě)入模式,如果文件不存在則創(chuàng)建),w+(讀寫(xiě)模式,如果文件不存在則創(chuàng)建),wx(寫(xiě)入模式,如果文件不存在則返回失敗),wx+(讀寫(xiě)模式,如果文件不存在則返回失敗),a(追加模式,如果文件不存在則創(chuàng)建),a+(讀取追加模式,如果文件不存在則創(chuàng)建),ax(追加模式,如果文件不存在則返回失敗),ax+(讀取追加模式,如果文件不存在則返回失敗) */ openFile(filePath, mode) { return new Promise((resolve, reject) => { this.fs.open(filePath, mode, (err, fd) => { if (err) { reject(err) } else { resolve(fd) } }) }) } /** * 關(guān)閉文件 * @param {Object} fd 打開(kāi)文件時(shí)返回的文件標(biāo)識(shí)符 */ closeFile(fd) { return new Promise((resolve, reject) => { this.fs.close(fd, (fd, err) => { if (err) { reject(err) } else { resolve() } }) }) } /** * 查看文件或者目錄的操作權(quán)限,可讀寫(xiě)返回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) //不可訪(fǎng)問(wèn) } else { resolve(true) //可讀寫(xiě) } }) }) } /** * 獲取文件/目錄信息 * @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) } }) }) } /** * 創(chuàng)建目錄 * @param {Object} dir 目錄路徑 */ mkdir(dir) { return new Promise((resolve, reject) => { this.fs.mkdir(dir, err => { if (err) { reject(err) } else { resolve() } }) }) } /** * 遞歸創(chuàng)建目錄 * @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); // 去除前面的點(diǎn)號(hào) } /** * 獲取文件不含后綴名 * @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') })()
掃描二維碼推送至手機(jī)訪(fǎng)問(wèn)。
版權(quán)聲明:本文由星星博客發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。