From de6182576d2ed09c2e3104c085f4d5f2914c8de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?= Date: Mon, 21 Sep 2020 16:57:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0is|isfile2=E4=B8=AA=E6=96=B9?= =?UTF-8?q?=E6=B3=95;exists=E6=96=B9=E6=B3=95=E6=94=B9=E4=B8=BA=E8=B0=83?= =?UTF-8?q?=E7=94=A8is;=E4=BC=98=E5=8C=96stat=E6=96=B9=E6=B3=95=E8=BF=94?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History.md | 54 ------------------------------ Readme.md | 31 +++++++++++++++--- index.js | 92 +++++++++++++++++++++++++++++++++++++--------------- index.mjs | 92 +++++++++++++++++++++++++++++++++++++--------------- package.json | 10 ++---- 5 files changed, 158 insertions(+), 121 deletions(-) delete mode 100644 History.md diff --git a/History.md b/History.md deleted file mode 100644 index a8c3e50..0000000 --- a/History.md +++ /dev/null @@ -1,54 +0,0 @@ -# 1.4.0 / 2020-09-19 -* [A] 增加esm模式 - -# 1.3.2 / 2020-01-18 -* [U] 增加静默参数, 可以不打印错误日志(用于某些特殊场景) - - -# 1.3.1 / 2020-01-09 -* [U] 优化异常输出 - - -# 1.3.0 / 2020-01-08 -* [A] 增加chown()方法 -* [A] cp()和 mv()支持对目录进行操作 -* [U] 优化异常处理, 友好的输出, 不终止代码往下执行 -* [U] 支持新版本node使用新API -* [U] rm()方法自动识别目录,不再需要提供第2个参数 - - -# 1.2.2 / 2020-01-02 -* [F] 修复改回同步时回调未移除, 导致在node v12.10报错的bug - - -# 1.2.1 / 2019-08-06 -* [U] 写操作改回同步 - -# 1.2.0 / 2019-07-16 -* [U] 优化结构 -* [U] 部分写操作改为异步 - - -# 1.1.0 / 2018-05-24 -* [A] 增加异常信息输出 -* [U] 优化`ls`API -* [U] 重命名 `this.self` 为 `this.origin` - - - -# 1.0.3 / 2017-12-23 -* [D] 删除异常信息输出 - - - -# 1.0.2 / 2017-11-20 -* [F] 修复非空目录无法删除的bug - - - -# 1.0.1 / 2017-04-24 -* [A] `ls`方法当第2个参数为`true`的时候,可以遍历子目录 - - -# 1.0.0 / 2017-02-26 -* 初始化项目 diff --git a/Readme.md b/Readme.md index f021cb7..5cc7914 100644 --- a/Readme.md +++ b/Readme.md @@ -3,9 +3,6 @@ # iofs > `iofs`是一个基于原生`fs`模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了`bash shell`, 习惯用命令行的朋友, 可能会比较亲切。 -## 更新日志 -[Change Logs](./History.md) - ## API + props @@ -21,8 +18,10 @@ - [.rm(origin)](#rmorigin) - [.stat(path)](#statpath) - [.isdir(path)](#isdirpath) + - [.isfile(path)](#isfilepath) - [.mkdir(dir, mode)](#mkdirdir-mode) - [.exists(path)](#existspath) + - [.is(path)](#isspath-mode) ## 属性 @@ -33,7 +32,7 @@ ## APIs -> 所有API均支持在最后传入一个 `silently`参数(v1.3.2新增), 用于静默执行, 不打印错误日志 +> 所有API均支持在最后传入一个 `debug`参数(v1.3.2新增), 用于打印错误日志 ### .cat(file) > 读取文件, 返回一个`Buffer对象` @@ -180,6 +179,15 @@ fs.rm('./foo') // 整个目录删除 --- +### .isfile(path) +> 判断指定目录是否为一个文件, 路径不存在或者不是文件都会返回 false + +| 参数 | 类型 | 是否必须 | 说明 | +| :--: | :--: | :--: | -- | +| path | ``| 是 | 要读取的文件 | + +--- + ### .mkdir(dir) > 创建目录, 会自动创建上级目录(如不存在) @@ -195,4 +203,17 @@ fs.rm('./foo') // 整个目录删除 | 参数 | 类型 | 是否必须 | 说明 | | :--: | :--: | :--: | -- | -| path | ``| 是 | 要读取的目录&文件 | \ No newline at end of file +| path | ``| 是 | 要读取的目录&文件 | + + +--- + +### .is(path, mode) +> 判断文件&目录是否存在 + +| 参数 | 类型 | 是否必须 | 说明 | +| :--: | :--: | :--: | -- | +| path | ``| 是 | 要读取的目录&文件 | +| mode | ``| 否 | 如 r: 4, w: 2, rw: 6 | + + diff --git a/index.js b/index.js index 65ad8f9..cee6147 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,27 @@ const FS = require('fs') const PATH = require('path') -const VERSION = +process.versions.node.split('.').slice(0, 2).join('.') +class Stats { + isFile() { + return false + } + isDirectory() { + return false + } + isSocket() { + return false + } + isSymbolicLink() { + return false + } +} + +const VERSION = +process.versions.node + .split('.') + .slice(0, 2) + .join('.') + +const EMPTY_STAT = new Stats() const Iofs = { origin: FS, @@ -16,11 +36,11 @@ const Iofs = { * @param {String} file [文件路径] * @param {Function} cb [回调] 可选 */ - cat(file, silently) { + cat(file, debug) { try { return FS.readFileSync(file) } catch (err) { - !silently && console.error('call cat(): ', err + '') + debug && console.error('call cat(): ', err + '') return null } }, @@ -31,7 +51,7 @@ const Iofs = { * @param {boolean} recursive [是否递归遍历子目录] * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.'和'..'] */ - ls(dir, recursive, silently) { + ls(dir, recursive, debug) { try { var list = FS.readdirSync(dir) @@ -43,13 +63,13 @@ const Iofs = { var tmp = list.concat() tmp.forEach(it => { if (this.isdir(it)) { - list = list.concat(this.ls(it, true)) + list = list.concat(this.ls(it)) } }) } return list } catch (err) { - !silently && console.error('call ls(): ', err + '') + debug && console.error('call ls(): ', err + '') return null } }, @@ -61,7 +81,7 @@ const Iofs = { * @param {Boolean} append [是否在后面追加,默认否] * @param {String} encode [编码, 默认utf8] */ - echo(data, file, append, encode, silently) { + echo(data, file, append, encode, debug) { if (!file) { return data } @@ -90,29 +110,29 @@ const Iofs = { } return true } catch (err) { - !silently && console.error('call echo(): ', err + '') + debug && console.error('call echo(): ', err + '') return false } }, //修改权限 - chmod(path, mode, silently) { + chmod(path, mode, debug) { try { FS.chmodSync(path, mode) return true } catch (err) { - !silently && console.error('call chmod(): ', err + '') + debug && console.error('call chmod(): ', err + '') return false } }, //修改所属用户 - chown(path, uid, gid, silently) { + chown(path, uid, gid, debug) { try { FS.chownSync(path, uid, gid) return true } catch (err) { - !silently && console.error('call chown(): ', err + '') + debug && console.error('call chown(): ', err + '') return false } }, @@ -122,7 +142,7 @@ const Iofs = { * @param {String} origin [原路径/原名] * @param {String} target [目标路径/新名] */ - mv(origin, target, silently) { + mv(origin, target, debug) { var updir = PATH.parse(target).dir if (!this.isdir(updir)) { this.mkdir(updir) @@ -137,7 +157,7 @@ const Iofs = { } return false } - !silently && console.error('call mv(): ', err + '') + debug && console.error('call mv(): ', err + '') return false } }, @@ -147,7 +167,7 @@ const Iofs = { * @param {String} origin [原路径] * @param {String} target [目标路径] */ - cp(origin, target, silently) { + cp(origin, target, debug) { try { // 如果是目录, 则递归操作 if (this.isdir(origin)) { @@ -170,7 +190,7 @@ const Iofs = { return true } catch (err) { - !silently && console.error('call cp(): ', err + '') + debug && console.error('call cp(): ', err + '') return false } }, @@ -179,7 +199,7 @@ const Iofs = { * [rm 删除文件/目录] * @param {[type]} origin [源文件/目录路径] */ - rm(origin, silently) { + rm(origin, debug) { try { if (this.isdir(origin)) { if (VERSION > 12.1) { @@ -194,7 +214,7 @@ const Iofs = { } return true } catch (err) { - !silently && console.error('call rm(): ', err + '') + debug && console.error('call rm(): ', err + '') return false } }, @@ -202,14 +222,14 @@ const Iofs = { /** * [stat 返回文件/目录的状态信息] * @param {[string]} path [目标路径] - * @param {[boolean]} silently [是否静默检测, 是否不打印错误日志] + * @param {[boolean]} debug [是否静默检测, 是否不打印错误日志] */ - stat(path, silently) { + stat(path, debug) { try { return FS.statSync(path) } catch (err) { - !silently && console.error('call stat(): ', err + '') - return Object.create(null) + debug && console.error('call stat(): ', err + '') + return EMPTY_STAT } }, @@ -219,7 +239,15 @@ const Iofs = { */ isdir(path) { try { - return this.stat(path, true).isDirectory() + return this.stat(path).isDirectory() + } catch (err) { + return false + } + }, + + isfile(path) { + try { + return this.stat(path).isFile() } catch (err) { return false } @@ -230,14 +258,14 @@ const Iofs = { * @param {String} dir [目标路径] * @param {Number} mode [目录权限, node v10.12起支持] */ - mkdir(dir, mode = 0o755, silently) { + mkdir(dir, mode = 0o755, debug) { try { if (VERSION > 10.12) { FS.mkdirSync(dir, { recursive: true, mode: mode }) } else { var updir = PATH.parse(dir).dir if (!updir) { - !silently && console.error('call mkdir(): ', 'Wrong dir path') + debug && console.error('call mkdir(): ', 'Wrong dir path') return false } @@ -250,7 +278,7 @@ const Iofs = { } return true } catch (err) { - !silently && console.error('call mkdir(): ', err + '') + debug && console.error('call mkdir(): ', err + '') return false } }, @@ -260,7 +288,17 @@ const Iofs = { * @param {String} file [目标路径] */ exists(file) { - return FS.existsSync(file) + return this.is(file, FS.constants.R_OK) + }, + + // 是否可读写 + is(file, mode) { + try { + FS.accessSync(file, mode) + return true + } catch (e) { + return false + } } } diff --git a/index.mjs b/index.mjs index 4adc00f..3f1762e 100644 --- a/index.mjs +++ b/index.mjs @@ -6,7 +6,27 @@ import FS from 'fs' import PATH from 'path' -const VERSION = +process.versions.node.split('.').slice(0, 2).join('.') +class STATS { + isFile() { + return false + } + isDirectory() { + return false + } + isSocket() { + return false + } + isSymbolicLink() { + return false + } +} + +const VERSION = +process.versions.node + .split('.') + .slice(0, 2) + .join('.') + +const EMPTY_STAT = new STATS() export default { origin: FS, @@ -16,11 +36,11 @@ export default { * @param {String} file [文件路径] * @param {Function} cb [回调] 可选 */ - cat(file, silently) { + cat(file, debug) { try { return FS.readFileSync(file) } catch (err) { - !silently && console.error('call cat(): ', err + '') + debug && console.error('call cat(): ', err + '') return null } }, @@ -31,7 +51,7 @@ export default { * @param {boolean} recursive [是否递归遍历子目录] * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.'和'..'] */ - ls(dir, recursive, silently) { + ls(dir, recursive, debug) { try { var list = FS.readdirSync(dir) @@ -43,13 +63,13 @@ export default { var tmp = list.concat() tmp.forEach(it => { if (this.isdir(it)) { - list = list.concat(this.ls(it, true)) + list = list.concat(this.ls(it)) } }) } return list } catch (err) { - !silently && console.error('call ls(): ', err + '') + debug && console.error('call ls(): ', err + '') return null } }, @@ -61,7 +81,7 @@ export default { * @param {Boolean} append [是否在后面追加,默认否] * @param {String} encode [编码, 默认utf8] */ - echo(data, file, append, encode, silently) { + echo(data, file, append, encode, debug) { if (!file) { return data } @@ -90,29 +110,29 @@ export default { } return true } catch (err) { - !silently && console.error('call echo(): ', err + '') + debug && console.error('call echo(): ', err + '') return false } }, //修改权限 - chmod(path, mode, silently) { + chmod(path, mode, debug) { try { FS.chmodSync(path, mode) return true } catch (err) { - !silently && console.error('call chmod(): ', err + '') + debug && console.error('call chmod(): ', err + '') return false } }, //修改所属用户 - chown(path, uid, gid, silently) { + chown(path, uid, gid, debug) { try { FS.chownSync(path, uid, gid) return true } catch (err) { - !silently && console.error('call chown(): ', err + '') + debug && console.error('call chown(): ', err + '') return false } }, @@ -122,7 +142,7 @@ export default { * @param {String} origin [原路径/原名] * @param {String} target [目标路径/新名] */ - mv(origin, target, silently) { + mv(origin, target, debug) { var updir = PATH.parse(target).dir if (!this.isdir(updir)) { this.mkdir(updir) @@ -137,7 +157,7 @@ export default { } return false } - !silently && console.error('call mv(): ', err + '') + debug && console.error('call mv(): ', err + '') return false } }, @@ -147,7 +167,7 @@ export default { * @param {String} origin [原路径] * @param {String} target [目标路径] */ - cp(origin, target, silently) { + cp(origin, target, debug) { try { // 如果是目录, 则递归操作 if (this.isdir(origin)) { @@ -170,7 +190,7 @@ export default { return true } catch (err) { - !silently && console.error('call cp(): ', err + '') + debug && console.error('call cp(): ', err + '') return false } }, @@ -179,7 +199,7 @@ export default { * [rm 删除文件/目录] * @param {[type]} origin [源文件/目录路径] */ - rm(origin, silently) { + rm(origin, debug) { try { if (this.isdir(origin)) { if (VERSION > 12.1) { @@ -194,7 +214,7 @@ export default { } return true } catch (err) { - !silently && console.error('call rm(): ', err + '') + debug && console.error('call rm(): ', err + '') return false } }, @@ -202,14 +222,14 @@ export default { /** * [stat 返回文件/目录的状态信息] * @param {[string]} path [目标路径] - * @param {[boolean]} silently [是否静默检测, 是否不打印错误日志] + * @param {[boolean]} debug [是否静默检测, 是否不打印错误日志] */ - stat(path, silently) { + stat(path, debug) { try { return FS.statSync(path) } catch (err) { - !silently && console.error('call stat(): ', err + '') - return Object.create(null) + debug && console.error('call stat(): ', err + '') + return EMPTY_STAT } }, @@ -219,7 +239,15 @@ export default { */ isdir(path) { try { - return this.stat(path, true).isDirectory() + return this.stat(path).isDirectory() + } catch (err) { + return false + } + }, + + isfile(path) { + try { + return this.stat(path).isFile() } catch (err) { return false } @@ -230,14 +258,14 @@ export default { * @param {String} dir [目标路径] * @param {Number} mode [目录权限, node v10.12起支持] */ - mkdir(dir, mode = 0o755, silently) { + mkdir(dir, mode = 0o755, debug) { try { if (VERSION > 10.12) { FS.mkdirSync(dir, { recursive: true, mode: mode }) } else { var updir = PATH.parse(dir).dir if (!updir) { - !silently && console.error('call mkdir(): ', 'Wrong dir path') + debug && console.error('call mkdir(): ', 'Wrong dir path') return false } @@ -250,7 +278,7 @@ export default { } return true } catch (err) { - !silently && console.error('call mkdir(): ', err + '') + debug && console.error('call mkdir(): ', err + '') return false } }, @@ -260,6 +288,16 @@ export default { * @param {String} file [目标路径] */ exists(file) { - return FS.existsSync(file) + return this.is(file, FS.constants.R_OK) + }, + + // 是否可读写 + is(file, mode) { + try { + FS.accessSync(file, mode) + return true + } catch (e) { + return false + } } } diff --git a/package.json b/package.json index 0cc9c69..38cf20a 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,13 @@ { "name": "iofs", - "version": "1.4.0", + "version": "1.5.0", "description": "iofs是一个基于原生fs模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了bash shell。", "main": "index.js", "repository": { "type": "git", "url": "https://github.com/bytedo/iofs.git" }, - "keywords": [ - "fivejs", - "fs", - "iofs", - "fs.io", - "file" - ], + "keywords": ["fivejs", "fs", "iofs", "fs.io", "file"], "author": "yutent", "license": "MIT" }