Node.js 对文件、文件夹读写操作主要靠内置的 fs 模块

  1. const fs = require('fs');

fs 模块提供了几种不同调用风格的 API 支持文件读写,fs.stat 方法可以获取文件的基本信息,下面示例展示了不同风格 API 调用 fs.stat 方法

callback 风格

Node.js 默认的异步操作是 callback 风格 callback(err, returnValue)

  1. err: 如果程序处理出现异常,错误信息放在回调函数的第一个参数,如果没有错误 err 为 null
  2. returnValue:程序正常处理完成后结果放在回调函数第二个参数 ```javascript const fs = require(‘fs’);

fs.stat(‘.’, (err, stats) => { if(err) { // 处理错误。 } else { // 使用 stats } });

  1. <a name="ts4At"></a>
  2. ## fs promise API
  3. fs.promises API 提供了一组和 callback 风格对应的方法,返回 Promise 对象而不使用回调,避免出现 callback 嵌套的回调地狱问题
  4. API 可通过 `require('fs').promises` 或 `require('fs/promises')`访问
  5. > require('fs/promises') v14 后可用
  6. ```javascript
  7. const fs = require('fs').promises;
  8. // const fs = require('fs/promises');
  9. fs.stat('.').then(stats => {
  10. // 使用 stats
  11. }).catch(error => {
  12. // 处理错误
  13. });

promisify

Node.js 使用回调风格一方面是因为性能原因,一方面是因为 Node.js 诞生的时候 Promise 规范还没有制定,在 Promise 规范制定后 Node.js 通过内置模块 util 提供的 promisify 方法可以把所有标准 callback 风格方法转成 promise 风格方法

  1. const util = require('util');
  2. const fs = require('fs');
  3. const stat = util.promisify(fs.stat);
  4. stat('.').then(stats => {
  5. // 使用 stats
  6. }).catch(error => {
  7. // 处理错误
  8. });

同步方法

很多时候需要读写文件后才能进行某些操作,在没有性能问题的场景可以使用 fs 提供的同步函数来降低代码复杂度
fs 为大部分方法提供了一个同步版本,命名规则是方法名称后面添加 Sync ,比如 fs.readFile 和 fs.readFileSync,stat 方法也有对应的同步版本

  1. const fs = require('fs');
  2. try {
  3. const stats = fs.statSync('.');
  4. // 使用 stats
  5. } catch(error) {
  6. // 处理错误
  7. }

stat

上面例子简单使用过 fs.stat 方法获取文件基本信息,如果打印 stats 对象可以得到文件基本属性

  1. Stats {
  2. dev: 16777220,
  3. mode: 16877,
  4. nlink: 3,
  5. uid: 501,
  6. gid: 20,
  7. rdev: 0,
  8. blksize: 4096,
  9. ino: 4301278483,
  10. size: 96,
  11. blocks: 0,
  12. atimeMs: 1588483554315.173,
  13. mtimeMs: 1588483370684.5703,
  14. ctimeMs: 1588483370684.5703,
  15. birthtimeMs: 1588483342193.8625,
  16. atime: 2020-05-03T05:25:54.315Z,
  17. mtime: 2020-05-03T05:22:50.685Z,
  18. ctime: 2020-05-03T05:22:50.685Z,
  19. birthtime: 2020-05-03T05:22:22.194Z
  20. }

stats 对象还提供了几个非常有用的属性、方法获取文件的更多信息,比较常用的有

  1. stats.isDirectory():判断文件是否是个文件夹
  2. stats.isFile():判断文件是否是普通文件
  3. stats.isSymbolicLink():判断文件是否是软链接
  4. stats.size:获取文件字节数
  1. const fs = require('fs');
  2. fs.stat('.', (err, stats) => {
  3. if(!err) {
  4. console.log(stats);
  5. console.log(stats.isFile());
  6. console.log(stats.size);
  7. }
  8. });