From 9ebfac29f216a8a03d8b8eaab1bd87f622742e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?= Date: Mon, 20 Nov 2017 01:21:33 +0800 Subject: [PATCH] fix `fs.rm` bug --- History.md | 4 + index.js | 381 +++++++++++++++++++++++++-------------------------- package.json | 28 ++-- 3 files changed, 198 insertions(+), 215 deletions(-) diff --git a/History.md b/History.md index 3c9dc26..940d129 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,7 @@ +1.0.2 / 2017-11-20 + * [fixed] Fixed remove the dir not empty call error. + + 1.0.1 / 2017-04-24 * [add] ls function can recur list child folder with second para set to be true. diff --git a/index.js b/index.js index 7f3a3c3..641edc3 100644 --- a/index.js +++ b/index.js @@ -1,234 +1,219 @@ /** - * + * * @authors yutent (yutent@doui.cc) * @date 2015-12-28 14:28:38 * */ -"use strict"; +'use strict' const fs = require('fs'), - path = require('path'); + path = require('path') class Iofs { + constructor() { + this.self = fs + } - constructor(){ - this.self = fs + /** + * [cat 文件读取] + * @param {String} file [文件路径] + * @param {Function} cb [回调] 可选 + */ + cat(file) { + try { + return fs.readFileSync(file) + } catch (err) { + console.error(err) + return null } + } + /** + * [ls 读取整个目录(不遍历子目录)] + * @param {string} dir [目标路径] + * @param {boolean} child [是否遍历子目录] + * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.'和'..'] + */ + ls(dir, child) { + try { + let list = fs.readdirSync(dir) - /** - * [cat 文件读取] - * @param {String} file [文件路径] - * @param {Function} cb [回调] 可选 - */ - cat(file){ - try{ - return fs.readFileSync(file) - }catch(err){ - console.error(err) - return null - } - } + if (!child) return list - /** - * [ls 读取整个目录(不遍历子目录)] - * @param {string} dir [目标路径] - * @param {boolean} child [是否遍历子目录] - * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.'和'..'] - */ - ls(dir, child){ - try{ - let list = fs.readdirSync(dir) - - if(!child) - return list - - let tmp = Array.from(list) - tmp.forEach(it => { - let childdir = path.join(dir, it) - if(this.isdir(childdir)){ - list = Array.prototype.concat.apply(list, this.ls(childdir, true).map(sub => { - return path.join(it, sub) - })) - } + let tmp = Array.from(list) + tmp.forEach(it => { + let childdir = path.join(dir, it) + if (this.isdir(childdir)) { + list = Array.prototype.concat.apply( + list, + this.ls(childdir, true).map(sub => { + return path.join(it, sub) }) - return list - }catch(err){ - console.error(err) - return null + ) } + }) + return list + } catch (err) { + console.error(err) + return null + } + } + + /** + * [echo 写文件] + * @param {String|Buffer|Number} data [要写入的数据] + * @param {String} file [要写的文件] + * @param {Boolean} append [是否在后面追加,默认否] + * @param {String} encode [编码, 默认utf8] + */ + echo(data, file, append, encode) { + if (!file) { + return data } - - - /** - * [echo 写文件] - * @param {String|Buffer|Number} data [要写入的数据] - * @param {String} file [要写的文件] - * @param {Boolean} append [是否在后面追加,默认否] - * @param {String} encode [编码, 默认utf8] - */ - echo(data, file, append, encode){ - if(!file){ - return data; - } - - let updir = path.parse(file).dir, - opt = {}; - if(!this.isdir(updir)){ - this.mkdir(updir) - } - - if(append && typeof append === 'string'){ - encode = append; - append = false; - opt.encoding = encode; - }else{ - if(typeof encode === 'string'){ - opt.encoding = encode - } - } - - try{ - if(!!append){ - fs.appendFileSync(file, data, opt) - }else{ - fs.writeFileSync(file, data, opt) - } - }catch(err){ - console.error(err) - } + let updir = path.parse(file).dir, + opt = {} + if (!this.isdir(updir)) { + this.mkdir(updir) } - - - //修改权限 - chmod(path, mode){ - try{ - fs.chmodSync(path, mode) - }catch(err){ - console.error(err) - } - } - - - /** - * [mv 移动文件,兼具重命名功能] - * @param {String} from [原路径/原名] - * @param {String} to [目标路径/新名] - */ - mv(from, to){ - - let updir = path.parse(to).dir - if(!this.isdir(updir)) - this.mkdir(updir) - - try{ - fs.renameSync(from, to) - }catch(e){ - let rs = fs.createReadStream(from), - ws = fs.createWriteStream(to); - - rs.pipe(ws) - rs.on('end', err => { - this.rm(from) - }) - } + if (append && typeof append === 'string') { + encode = append + append = false + opt.encoding = encode + } else { + if (typeof encode === 'string') { + opt.encoding = encode + } } + try { + if (!!append) { + fs.appendFileSync(file, data, opt) + } else { + fs.writeFileSync(file, data, opt) + } + } catch (err) { + console.error(err) + } + } + //修改权限 + chmod(path, mode) { + try { + fs.chmodSync(path, mode) + } catch (err) { + console.error(err) + } + } - cp(from, to){ - let updir = path.parse(to).dir - if(!this.isdir(updir)){ - this.mkdir(updir) - } + /** + * [mv 移动文件,兼具重命名功能] + * @param {String} from [原路径/原名] + * @param {String} to [目标路径/新名] + */ + mv(from, to) { + let updir = path.parse(to).dir + if (!this.isdir(updir)) this.mkdir(updir) - let rs = fs.createReadStream(from), - ws = fs.createWriteStream(to); + try { + fs.renameSync(from, to) + } catch (e) { + let rs = fs.createReadStream(from), + ws = fs.createWriteStream(to) - rs.pipe(ws) - rs.on('end', err => console.error(err)) + rs.pipe(ws) + rs.on('end', err => { + this.rm(from) + }) + } + } + cp(from, to) { + let updir = path.parse(to).dir + if (!this.isdir(updir)) { + this.mkdir(updir) } + let rs = fs.createReadStream(from), + ws = fs.createWriteStream(to) - /** - * [rm 删除文件/目录] - * @param {[type]} from [源文件/目录路径] - * @param {[type]} recursion [是否递归删除,若删除目录,此值须为true] - */ - rm(from, recursion){ - try{ - if(!!recursion){ - fs.rmdirSync(from) - }else{ - fs.unlinkSync(from) - } - }catch(err){ - console.error(err) - - } + rs.pipe(ws) + rs.on('end', err => console.error(err)) + } + + /** + * [rm 删除文件/目录] + * @param {[type]} from [源文件/目录路径] + * @param {[type]} recursion [是否递归删除,若删除目录,此值须为true] + */ + rm(from, recursion) { + try { + if (!!recursion) { + let list = this.ls(from) + list.forEach(it => { + it = path.resolve(from, it) + this.rm(it, this.isdir(it)) + }) + fs.rmdirSync(from) + } else { + fs.unlinkSync(from) + } + } catch (err) { + console.error(err) + } + } + + /** + * [stat 返回文件/目录的状态信息] + * @param {[type]} path [目标路径] + */ + stat(path) { + try { + return fs.statSync(path) + } catch (err) { + return null + } + } + + /** + * [isdir 判断目标是否为目录] + * @param {String} path [目标路径] + */ + isdir(path) { + try { + return this.stat(path).isDirectory() + } catch (err) { + return false + } + } + + /** + * [mkdir 新建目录] + * @param {String} dir [目标路径] + */ + mkdir(dir) { + let updir = path.parse(dir).dir + if (!updir) return + + if (!this.isdir(updir)) { + this.mkdir(updir) } - - /** - * [stat 返回文件/目录的状态信息] - * @param {[type]} path [目标路径] - */ - stat(path){ - try{ - return fs.statSync(path) - }catch(err){ - return null - } + try { + fs.mkdirSync(dir) + } catch (err) { + console.error(err) } + } - - /** - * [isdir 判断目标是否为目录] - * @param {String} path [目标路径] - */ - isdir(path){ - try{ - return this.stat(path).isDirectory() - }catch(err){ - return false - } - } - - - /** - * [mkdir 新建目录] - * @param {String} dir [目标路径] - */ - mkdir(dir){ - let updir = path.parse(dir).dir - if(!updir) - return - - if(!this.isdir(updir)){ - this.mkdir(updir) - } - - try{ - fs.mkdirSync(dir) - }catch(err){ - console.error(err) - } - } - - /** - * [exists 判断目标(文件/目录)是否存在] - * @param {String} file [目标路径] - */ - exists(file){ - return fs.existsSync(file) - } - - - + /** + * [exists 判断目标(文件/目录)是否存在] + * @param {String} file [目标路径] + */ + exists(file) { + return fs.existsSync(file) + } } - -module.exports = new Iofs \ No newline at end of file +module.exports = new Iofs() diff --git a/package.json b/package.json index d19d104..f552567 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,13 @@ { - "name": "iofs", - "version": "1.0.1", - "description": "Base on native fs module, for easy using.", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/yutent/iofs.git" - }, - "keywords": [ - "dojs", - "fs", - "iofs", - "fs.io", - "file" - ], - "author": "yutent", - "license": "MIT" + "name": "iofs", + "version": "1.0.2", + "description": "Base on native fs module, for easy using.", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/yutent/iofs.git" + }, + "keywords": ["dojs", "fs", "iofs", "fs.io", "file"], + "author": "yutent", + "license": "MIT" }