增加is|isfile2个方法;exists方法改为调用is;优化stat方法返回

master 1.5.0
宇天 2020-09-21 16:57:40 +08:00
parent 3b3c285d0c
commit de6182576d
5 changed files with 158 additions and 121 deletions

View File

@ -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
* 初始化项目

View File

@ -3,9 +3,6 @@
# iofs # iofs
> `iofs`是一个基于原生`fs`模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了`bash shell`, 习惯用命令行的朋友, 可能会比较亲切。 > `iofs`是一个基于原生`fs`模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了`bash shell`, 习惯用命令行的朋友, 可能会比较亲切。
## 更新日志
[Change Logs](./History.md)
## API ## API
+ props + props
@ -21,8 +18,10 @@
- [.rm(origin)](#rmorigin) - [.rm(origin)](#rmorigin)
- [.stat(path)](#statpath) - [.stat(path)](#statpath)
- [.isdir(path)](#isdirpath) - [.isdir(path)](#isdirpath)
- [.isfile(path)](#isfilepath)
- [.mkdir(dir, mode)](#mkdirdir-mode) - [.mkdir(dir, mode)](#mkdirdir-mode)
- [.exists(path)](#existspath) - [.exists(path)](#existspath)
- [.is(path)](#isspath-mode)
## 属性 ## 属性
@ -33,7 +32,7 @@
## APIs ## APIs
> 所有API均支持在最后传入一个 `silently<Boolean>`参数(v1.3.2新增), 用于静默执行, 不打印错误日志 > 所有API均支持在最后传入一个 `debug<Boolean>`参数(v1.3.2新增), 用于打印错误日志
### .cat(file) ### .cat(file)
> 读取文件, 返回一个`Buffer对象` > 读取文件, 返回一个`Buffer对象`
@ -180,6 +179,15 @@ fs.rm('./foo') // 整个目录删除
--- ---
### .isfile(path)
> 判断指定目录是否为一个文件, 路径不存在或者不是文件都会返回 false
| 参数 | 类型 | 是否必须 | 说明 |
| :--: | :--: | :--: | -- |
| path | `<String>`| 是 | 要读取的文件 |
---
### .mkdir(dir) ### .mkdir(dir)
> 创建目录, 会自动创建上级目录(如不存在) > 创建目录, 会自动创建上级目录(如不存在)
@ -196,3 +204,16 @@ fs.rm('./foo') // 整个目录删除
| 参数 | 类型 | 是否必须 | 说明 | | 参数 | 类型 | 是否必须 | 说明 |
| :--: | :--: | :--: | -- | | :--: | :--: | :--: | -- |
| path | `<String>`| 是 | 要读取的目录&文件 | | path | `<String>`| 是 | 要读取的目录&文件 |
---
### .is(path, mode)
> 判断文件&目录是否存在
| 参数 | 类型 | 是否必须 | 说明 |
| :--: | :--: | :--: | -- |
| path | `<String>`| 是 | 要读取的目录&文件 |
| mode | `<Number>`| 否 | 如 r: 4, w: 2, rw: 6 |

View File

@ -6,7 +6,27 @@
const FS = require('fs') const FS = require('fs')
const PATH = require('path') 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 = { const Iofs = {
origin: FS, origin: FS,
@ -16,11 +36,11 @@ const Iofs = {
* @param {String} file [文件路径] * @param {String} file [文件路径]
* @param {Function} cb [回调] 可选 * @param {Function} cb [回调] 可选
*/ */
cat(file, silently) { cat(file, debug) {
try { try {
return FS.readFileSync(file) return FS.readFileSync(file)
} catch (err) { } catch (err) {
!silently && console.error('call cat(): ', err + '') debug && console.error('call cat(): ', err + '')
return null return null
} }
}, },
@ -31,7 +51,7 @@ const Iofs = {
* @param {boolean} recursive [是否递归遍历子目录] * @param {boolean} recursive [是否递归遍历子目录]
* @return {array} [返回目标目录所有文件名和子目录名, 不包括'.''..'] * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.''..']
*/ */
ls(dir, recursive, silently) { ls(dir, recursive, debug) {
try { try {
var list = FS.readdirSync(dir) var list = FS.readdirSync(dir)
@ -43,13 +63,13 @@ const Iofs = {
var tmp = list.concat() var tmp = list.concat()
tmp.forEach(it => { tmp.forEach(it => {
if (this.isdir(it)) { if (this.isdir(it)) {
list = list.concat(this.ls(it, true)) list = list.concat(this.ls(it))
} }
}) })
} }
return list return list
} catch (err) { } catch (err) {
!silently && console.error('call ls(): ', err + '') debug && console.error('call ls(): ', err + '')
return null return null
} }
}, },
@ -61,7 +81,7 @@ const Iofs = {
* @param {Boolean} append [是否在后面追加默认否] * @param {Boolean} append [是否在后面追加默认否]
* @param {String} encode [编码, 默认utf8] * @param {String} encode [编码, 默认utf8]
*/ */
echo(data, file, append, encode, silently) { echo(data, file, append, encode, debug) {
if (!file) { if (!file) {
return data return data
} }
@ -90,29 +110,29 @@ const Iofs = {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call echo(): ', err + '') debug && console.error('call echo(): ', err + '')
return false return false
} }
}, },
//修改权限 //修改权限
chmod(path, mode, silently) { chmod(path, mode, debug) {
try { try {
FS.chmodSync(path, mode) FS.chmodSync(path, mode)
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call chmod(): ', err + '') debug && console.error('call chmod(): ', err + '')
return false return false
} }
}, },
//修改所属用户 //修改所属用户
chown(path, uid, gid, silently) { chown(path, uid, gid, debug) {
try { try {
FS.chownSync(path, uid, gid) FS.chownSync(path, uid, gid)
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call chown(): ', err + '') debug && console.error('call chown(): ', err + '')
return false return false
} }
}, },
@ -122,7 +142,7 @@ const Iofs = {
* @param {String} origin [原路径/原名] * @param {String} origin [原路径/原名]
* @param {String} target [目标路径/新名] * @param {String} target [目标路径/新名]
*/ */
mv(origin, target, silently) { mv(origin, target, debug) {
var updir = PATH.parse(target).dir var updir = PATH.parse(target).dir
if (!this.isdir(updir)) { if (!this.isdir(updir)) {
this.mkdir(updir) this.mkdir(updir)
@ -137,7 +157,7 @@ const Iofs = {
} }
return false return false
} }
!silently && console.error('call mv(): ', err + '') debug && console.error('call mv(): ', err + '')
return false return false
} }
}, },
@ -147,7 +167,7 @@ const Iofs = {
* @param {String} origin [原路径] * @param {String} origin [原路径]
* @param {String} target [目标路径] * @param {String} target [目标路径]
*/ */
cp(origin, target, silently) { cp(origin, target, debug) {
try { try {
// 如果是目录, 则递归操作 // 如果是目录, 则递归操作
if (this.isdir(origin)) { if (this.isdir(origin)) {
@ -170,7 +190,7 @@ const Iofs = {
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call cp(): ', err + '') debug && console.error('call cp(): ', err + '')
return false return false
} }
}, },
@ -179,7 +199,7 @@ const Iofs = {
* [rm 删除文件/目录] * [rm 删除文件/目录]
* @param {[type]} origin [源文件/目录路径] * @param {[type]} origin [源文件/目录路径]
*/ */
rm(origin, silently) { rm(origin, debug) {
try { try {
if (this.isdir(origin)) { if (this.isdir(origin)) {
if (VERSION > 12.1) { if (VERSION > 12.1) {
@ -194,7 +214,7 @@ const Iofs = {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call rm(): ', err + '') debug && console.error('call rm(): ', err + '')
return false return false
} }
}, },
@ -202,14 +222,14 @@ const Iofs = {
/** /**
* [stat 返回文件/目录的状态信息] * [stat 返回文件/目录的状态信息]
* @param {[string]} path [目标路径] * @param {[string]} path [目标路径]
* @param {[boolean]} silently [是否静默检测, 是否不打印错误日志] * @param {[boolean]} debug [是否静默检测, 是否不打印错误日志]
*/ */
stat(path, silently) { stat(path, debug) {
try { try {
return FS.statSync(path) return FS.statSync(path)
} catch (err) { } catch (err) {
!silently && console.error('call stat(): ', err + '') debug && console.error('call stat(): ', err + '')
return Object.create(null) return EMPTY_STAT
} }
}, },
@ -219,7 +239,15 @@ const Iofs = {
*/ */
isdir(path) { isdir(path) {
try { 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) { } catch (err) {
return false return false
} }
@ -230,14 +258,14 @@ const Iofs = {
* @param {String} dir [目标路径] * @param {String} dir [目标路径]
* @param {Number} mode [目录权限, node v10.12起支持] * @param {Number} mode [目录权限, node v10.12起支持]
*/ */
mkdir(dir, mode = 0o755, silently) { mkdir(dir, mode = 0o755, debug) {
try { try {
if (VERSION > 10.12) { if (VERSION > 10.12) {
FS.mkdirSync(dir, { recursive: true, mode: mode }) FS.mkdirSync(dir, { recursive: true, mode: mode })
} else { } else {
var updir = PATH.parse(dir).dir var updir = PATH.parse(dir).dir
if (!updir) { if (!updir) {
!silently && console.error('call mkdir(): ', 'Wrong dir path') debug && console.error('call mkdir(): ', 'Wrong dir path')
return false return false
} }
@ -250,7 +278,7 @@ const Iofs = {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call mkdir(): ', err + '') debug && console.error('call mkdir(): ', err + '')
return false return false
} }
}, },
@ -260,7 +288,17 @@ const Iofs = {
* @param {String} file [目标路径] * @param {String} file [目标路径]
*/ */
exists(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
}
} }
} }

View File

@ -6,7 +6,27 @@
import FS from 'fs' import FS from 'fs'
import PATH from 'path' 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 { export default {
origin: FS, origin: FS,
@ -16,11 +36,11 @@ export default {
* @param {String} file [文件路径] * @param {String} file [文件路径]
* @param {Function} cb [回调] 可选 * @param {Function} cb [回调] 可选
*/ */
cat(file, silently) { cat(file, debug) {
try { try {
return FS.readFileSync(file) return FS.readFileSync(file)
} catch (err) { } catch (err) {
!silently && console.error('call cat(): ', err + '') debug && console.error('call cat(): ', err + '')
return null return null
} }
}, },
@ -31,7 +51,7 @@ export default {
* @param {boolean} recursive [是否递归遍历子目录] * @param {boolean} recursive [是否递归遍历子目录]
* @return {array} [返回目标目录所有文件名和子目录名, 不包括'.''..'] * @return {array} [返回目标目录所有文件名和子目录名, 不包括'.''..']
*/ */
ls(dir, recursive, silently) { ls(dir, recursive, debug) {
try { try {
var list = FS.readdirSync(dir) var list = FS.readdirSync(dir)
@ -43,13 +63,13 @@ export default {
var tmp = list.concat() var tmp = list.concat()
tmp.forEach(it => { tmp.forEach(it => {
if (this.isdir(it)) { if (this.isdir(it)) {
list = list.concat(this.ls(it, true)) list = list.concat(this.ls(it))
} }
}) })
} }
return list return list
} catch (err) { } catch (err) {
!silently && console.error('call ls(): ', err + '') debug && console.error('call ls(): ', err + '')
return null return null
} }
}, },
@ -61,7 +81,7 @@ export default {
* @param {Boolean} append [是否在后面追加默认否] * @param {Boolean} append [是否在后面追加默认否]
* @param {String} encode [编码, 默认utf8] * @param {String} encode [编码, 默认utf8]
*/ */
echo(data, file, append, encode, silently) { echo(data, file, append, encode, debug) {
if (!file) { if (!file) {
return data return data
} }
@ -90,29 +110,29 @@ export default {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call echo(): ', err + '') debug && console.error('call echo(): ', err + '')
return false return false
} }
}, },
//修改权限 //修改权限
chmod(path, mode, silently) { chmod(path, mode, debug) {
try { try {
FS.chmodSync(path, mode) FS.chmodSync(path, mode)
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call chmod(): ', err + '') debug && console.error('call chmod(): ', err + '')
return false return false
} }
}, },
//修改所属用户 //修改所属用户
chown(path, uid, gid, silently) { chown(path, uid, gid, debug) {
try { try {
FS.chownSync(path, uid, gid) FS.chownSync(path, uid, gid)
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call chown(): ', err + '') debug && console.error('call chown(): ', err + '')
return false return false
} }
}, },
@ -122,7 +142,7 @@ export default {
* @param {String} origin [原路径/原名] * @param {String} origin [原路径/原名]
* @param {String} target [目标路径/新名] * @param {String} target [目标路径/新名]
*/ */
mv(origin, target, silently) { mv(origin, target, debug) {
var updir = PATH.parse(target).dir var updir = PATH.parse(target).dir
if (!this.isdir(updir)) { if (!this.isdir(updir)) {
this.mkdir(updir) this.mkdir(updir)
@ -137,7 +157,7 @@ export default {
} }
return false return false
} }
!silently && console.error('call mv(): ', err + '') debug && console.error('call mv(): ', err + '')
return false return false
} }
}, },
@ -147,7 +167,7 @@ export default {
* @param {String} origin [原路径] * @param {String} origin [原路径]
* @param {String} target [目标路径] * @param {String} target [目标路径]
*/ */
cp(origin, target, silently) { cp(origin, target, debug) {
try { try {
// 如果是目录, 则递归操作 // 如果是目录, 则递归操作
if (this.isdir(origin)) { if (this.isdir(origin)) {
@ -170,7 +190,7 @@ export default {
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call cp(): ', err + '') debug && console.error('call cp(): ', err + '')
return false return false
} }
}, },
@ -179,7 +199,7 @@ export default {
* [rm 删除文件/目录] * [rm 删除文件/目录]
* @param {[type]} origin [源文件/目录路径] * @param {[type]} origin [源文件/目录路径]
*/ */
rm(origin, silently) { rm(origin, debug) {
try { try {
if (this.isdir(origin)) { if (this.isdir(origin)) {
if (VERSION > 12.1) { if (VERSION > 12.1) {
@ -194,7 +214,7 @@ export default {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call rm(): ', err + '') debug && console.error('call rm(): ', err + '')
return false return false
} }
}, },
@ -202,14 +222,14 @@ export default {
/** /**
* [stat 返回文件/目录的状态信息] * [stat 返回文件/目录的状态信息]
* @param {[string]} path [目标路径] * @param {[string]} path [目标路径]
* @param {[boolean]} silently [是否静默检测, 是否不打印错误日志] * @param {[boolean]} debug [是否静默检测, 是否不打印错误日志]
*/ */
stat(path, silently) { stat(path, debug) {
try { try {
return FS.statSync(path) return FS.statSync(path)
} catch (err) { } catch (err) {
!silently && console.error('call stat(): ', err + '') debug && console.error('call stat(): ', err + '')
return Object.create(null) return EMPTY_STAT
} }
}, },
@ -219,7 +239,15 @@ export default {
*/ */
isdir(path) { isdir(path) {
try { 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) { } catch (err) {
return false return false
} }
@ -230,14 +258,14 @@ export default {
* @param {String} dir [目标路径] * @param {String} dir [目标路径]
* @param {Number} mode [目录权限, node v10.12起支持] * @param {Number} mode [目录权限, node v10.12起支持]
*/ */
mkdir(dir, mode = 0o755, silently) { mkdir(dir, mode = 0o755, debug) {
try { try {
if (VERSION > 10.12) { if (VERSION > 10.12) {
FS.mkdirSync(dir, { recursive: true, mode: mode }) FS.mkdirSync(dir, { recursive: true, mode: mode })
} else { } else {
var updir = PATH.parse(dir).dir var updir = PATH.parse(dir).dir
if (!updir) { if (!updir) {
!silently && console.error('call mkdir(): ', 'Wrong dir path') debug && console.error('call mkdir(): ', 'Wrong dir path')
return false return false
} }
@ -250,7 +278,7 @@ export default {
} }
return true return true
} catch (err) { } catch (err) {
!silently && console.error('call mkdir(): ', err + '') debug && console.error('call mkdir(): ', err + '')
return false return false
} }
}, },
@ -260,6 +288,16 @@ export default {
* @param {String} file [目标路径] * @param {String} file [目标路径]
*/ */
exists(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
}
} }
} }

View File

@ -1,19 +1,13 @@
{ {
"name": "iofs", "name": "iofs",
"version": "1.4.0", "version": "1.5.0",
"description": "iofs是一个基于原生fs模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了bash shell。", "description": "iofs是一个基于原生fs模块封装的工具, 旨在提供更加方便实用一些常用的API方法(同步), API习惯参考了bash shell。",
"main": "index.js", "main": "index.js",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/bytedo/iofs.git" "url": "https://github.com/bytedo/iofs.git"
}, },
"keywords": [ "keywords": ["fivejs", "fs", "iofs", "fs.io", "file"],
"fivejs",
"fs",
"iofs",
"fs.io",
"file"
],
"author": "yutent", "author": "yutent",
"license": "MIT" "license": "MIT"
} }