Node.js 对文件、文件夹读写操作主要靠内置的 fs 模块
const fs = require('fs');
fs 模块提供了几种不同调用风格的 API 支持文件读写。
其中 fs.stat 方法可以获取文件的基本信息,下面示例展示了不同风格 API 调用 fs.stat 方法
风格
同步方式
fs 为大部分方法提供了一个同步版本,命名规则是方法名称后面添加 Sync
,比如 fs.readFile
和 fs.readFileSync
,stat 方法也有对应的同步版本
在没有性能问题的场景可以使用 fs 提供的同步函数来降低代码复杂度
const fs = require('fs');
try {
const stats = fs.statSync('./xxx');
// 使用 stats
} catch(error) {
// 处理错误
}
callback
Node.js 默认的异步操作是 callback 风格 callback(err, returnValue)
- err: 如果程序处理出现异常,错误信息放在回调函数的第一个参数,如果没有错误 err 为 null
- returnValue:程序正常处理完成后结果放在回调函数第二个参数 ```javascript const fs = require(‘fs’);
fs.stat(‘xxx’, (err, stats) => { if(err) { // 处理错误。 } else { // 使用 stats } });
<a name="Dkwcd"></a>
## fs promise API
fs.promises API 提供了一组和 callback 风格对应的方法,返回 Promise 对象而不使用回调,避免出现 callback 嵌套的回调地狱问题<br />API 可通过 `require('fs').promises` 或 `require('fs/promises')`访问
> Node v14 后才推出了 require('fs/promises')
```javascript
const fs = require('fs').promises;
// const fs = require('fs/promises');
fs.stat('xxx').then(stats => {
// 使用 stats
}).catch(error => {
// 处理错误
});
promisify
Node.js 使用回调风格一方面是因为性能原因,一方面是因为 Node.js 诞生的时候 Promise 规范还没有制定。
在 Promise 规范制定后 Node.js 通过内置模块 util 提供的 promisify
方法可以把所有标准 callback 风格方法转成 promise 风格方法
const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
stat('.').then(stats => {
// 使用 stats
}).catch(error => {
// 处理错误
});
文件信息 stats
上面例子简单使用过 fs.stat 方法获取文件基本信息,如果打印 stats 对象可以得到文件基本属性
Stats {
dev: 3030972370,
mode: 33206,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 281474979346672,
size: 467,
blocks: 8,
atimeMs: 1649056725456.1492,
mtimeMs: 1649056725422.3071,
ctimeMs: 1649056725422.3071,
birthtimeMs: 1648907948261.7024,
atime: 2022-04-04T07:18:45.456Z,
mtime: 2022-04-04T07:18:45.422Z,
ctime: 2022-04-04T07:18:45.422Z,
birthtime: 2022-04-02T13:59:08.262Z
}
stats 对象还提供了几个非常有用的属性、方法获取文件的更多信息,比较常用的有
stats.isDirectory()
:判断文件是否是个文件夹stats.isFile()
:判断文件是否是普通文件stats.isSymbolicLink()
:判断文件是否是软链接stats.size
:获取文件字节数