浅谈Nodejs文件模块中的fs.mkdir和fs.rmdir


本文摘自PHP中文网,作者青灯夜游,侵删。

本篇文章带大家了解一下Nodejs文件操作fs.mkdir和fs.rmdir。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

【推荐学习:《nodejs 教程》】

fs.mkdir文件目录新增

案例使用

  • 逐级新增目录 会成功打印success

1

2

3

4

5

6

7

8

fs.mkdir("a", function (err) {

    // 当a不存在的时候直接创建 a/b会报错

 if (err) {

    console.log(err);

    return;

  }

  console.log("success...");//success

});

  • 跨级在不存在的目录下新增目录 报错啦!!,node本身的内置模块是不支持不存在的目录下新增目录的(这就是我要干的事)

1.gif

fs.mkdir的加强版

递归版本

思路

  • 对要新增的path路径根据"/"进行切割生成数组缓存

  • index 初始值= 1;对路径对应数组依次进行slice(0, index) 截取后join('/')成path字符串currentPath

  • fs.stat 用于描述文件的状态,如果不存在文件,就发生错误

  • 上一天发生错误调用 fs.mkdir(currentPath, 递归调用自己);

  • 文件存在调用自己

代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

function mkdir(pathStr, cb) {

  let pathList = pathStr.split("/");

  // 递归调用fs.mkdir

  let index = 1;

  function make(err) {

    if (err) return cb(err);

    if (index === pathList.length + 1) return cb();

    //每次 调用要将上次的已经生成的文件名做下次的目标文件,

    // 所以 slice(0, index) 第二参数也要 累加

    //slice(0, index) 截取后join('/')  成字符串

    let currentPath = pathList.slice(0, index++).join("/");

    // console.log("pathList.slice(0,index)", pathList.slice(0, index));

    fs.stat(currentPath, function (err) {

      if (err) {

        fs.mkdir(currentPath, make);

        console.log({ currentPath });

        // 如果不存在,再创建  fs.mkdir(currentPath, make);

      } else {

        make();

      }

    });

  }

  make();

}

测试:

此时已经不报错了

1

2

3

4

mkdir("a/b/c/d", function (err) {

  if (err) console.log(err);

   console.log("success...");

});

打印效果

2.gif

3.gif

for循环+await版本

实现思路

  • 以‘/’为基准切割路径为对应数组,对数组进行for循环遍历

  • for循环里existsSync()以同步的方法检测目录是否存在。

  如果目录存在 返回 true ,如果目录不存在 返回false 3. 不存在 fs.mkdir(currentPath)

实现代码

1

2

3

4

5

6

7

8

9

10

11

const fs = require("fs").promises; //node11后可以直接.promises

const { existsSync } = require("fs");

async function mkdir(pathStr, cb) {

  let pathList = pathStr.split("/");

  for (let i = 1; i <= pathList.length; i++) {

    let currentPath = pathList.slice(0, i).join("/");

    if (!existsSync(currentPath)) {

      await fs.mkdir(currentPath);

    }

  }

}

调用 将递归调用 平铺称then 链式调用

1

2

3

4

5

6

7

mkdir("a/b/c/d")

  .then(() => {

    console.log("创建成功");

  })

  .catch((err) => {

    console.log(err);

  });

打印效果

阅读剩余部分

相关阅读 >>

nodejs与javascript的区别

深入了解nodejs中的mongoose工具

nodejs学习之了解域名解析模块dns

详解nodejs中的querystring模块

3个值得收藏的实用nodejs软件包

详解使用docker给nodejs程序打包的方法

windows环境下怎么安装nodejs

前端用nodejs能做什么

深入浅析nodejs中的事件和事件循环

浅谈nodejs连接mysql数据库的方法

更多相关阅读请进入《nodejs》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    正在狠努力加载,请稍候...