• 6.fs模块的使用


    1.fs.stat检测是文件还是目录

    const fs = require("fs")
    
    fs.stat('./html', function(err, data){
        if (err) {
            console.log(err)
            return;
        }
        console.log(`是目录:${data.isDirectory()}`);  // 是目录:true
        console.log(`是文件:${data.isFile()}`);  // 是文件:false
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.fs.mkdir创建目录

    • 可以使用mkdirp这个三方模块进行递归创建多级目录
    /*
    path  路径
    mode  目录权限,默认777
    callback  回调,传递异常参数err
    */
    const fs = require("fs")
    
    fs.mkdir('./css', (err)=>{
        if (err) {
            console.log(err)
            return;
        }
        console.log("创建目录成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.fs.writeFile创建写入文件(自动创建)

    /*
    filename    (String)             文件名称
    data        (String | Buffer)    将要写入的内容,可以是字符串,也可以是buffer数据
    options     (Object)			 option数组对象
      encoding	(String)			 可选, 'utf8', 当使用buffer时,应该为bytes				
      mode      (Number)			 文件读写权限,默认0o666
      flag		(String)			 默认值 'w'
    callback    {Fuction}            回调,传递一个异常参数err
    */
    const fs = require("fs")
    
    fs.writeFile('./html/index.html', 'aaaaaaaa', (err) => {
        if(err){
            console.log(err);
            return;
        }
        console.log("创建文件并写入成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.fs.appendFile追加写入文件(自动创建)

    const fs = require("fs")
    
    fs.appendFile('./html/index.html', 'bbbbbbbbbb', (err)=>{
        if(err){
            console.log(err);
            return;
        }
        console.log("文件追加写入成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.fs.readFile读取文件

    const fs = require("fs")
    
    fs.readFile('./html/index.html', {}, function(err, data){
        if(err){
            console.log(err);
            return;
        }
        // 将Buffer转换为String类型
        console.log(data.toString());
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6.fs.readdir读取目录

    • 返回当前目录下的所有文件以及文件夹
    const fs = require("fs")
    
    fs.readdir('./html', {}, function(err, data){
        if(err){
            console.log(err);
            return;
        }
        console.log(data);  // 当前目录下的文件列表数组
    }) 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7.fs.rename重命名

    • 1.重命名
    const fs = require("fs")
    
    fs.rename('./html/index.html', './html/index.js', function(err){
        if(err){
            console.log(err);
            return;
        }
        console.log("文件重命名成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 2.移动文件
    const fs = require("fs")
    
    fs.rename('./html/index.html', './css/index.js', function(err){
        if(err){
            console.log(err);
            return;
        }
        console.log("文件移动成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    8.fs.rmdir删除目录

    const fs = require("fs")
    
    // 强制递归删除:opption: { recursive: true, force: true }
    fs.rmdir('./demo2/html', (err) => {
        if(err){
            console.log(err);
            return;
        }
        console.log("目录删除成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    9.fs.unlink删除文件

    const fs = require("fs")
    
    fs.unlink('./demo2/html/index.js', function(err){
        if(err){
            console.log(err);
            return;
        }
        console.log("文件删除成功")
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    10.fs.createReadStream从文件流中读取数据

    • 处理大文件
      const fs = require("fs")
      var readStream = fs.createReadStream('./demo2/1.pptx');
      
      var count = 0;
      var str = '';
      
      // 监听正在进行的
      readStream.on('data', (data)=>{
          str += data;
          count++;
      })
      
      // 监听读取完成
      readStream.on('end', ()=>{
          console.log(count);
          console.log(str);
      })
      
      // 监听异常
      readStream.on('error', (err)=>{
          console.log(err);
      })
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

    11.fs.createWriteStream将文件流写入文件

    • 处理大文件
      const fs = require("fs")
      
      var str = ''
      for (let index = 0; index < 500; index++) {
          str += "我是测试数据,也请你尊重我";
      }
      
      var writeStream = fs.createWriteStream('./demo2/2.txt');
      
      // 异步方法
      writeStream.write(str);
      
      // 标记写入完成,没有这个标记,则不能监听写入完成事件finish
      writeStream.end();
      
      writeStream.on('finish', function(){
          console.log("写入完成");
      })
      
      writeStream.on('error', (err)=>{
          console.log(err)
      })
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

    12.管道流

    • 通过管道,将一个文件的内容写入到另一个文件中
      const fs = require("fs")
      
      var readStream = fs.createReadStream('./demo2/1.gif');
      
      var writeStream = fs.createWriteStream('./demo1/2.gif');
      
      readStream.pipe(writeStream);
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    13.实践

    • 需求:在www目录下有img、css、js文件夹,和index.jpg、index.css、index.js三个文件,获取www目录下的文件夹和文件,分别输出两个列表

    • 1.bug写法

      const fs = require("fs")
      const path = require('path')
      
      var dirLst = []
      var fileLst = []
      const dstPath = 'F:\\projects\\nodejs\\demo2\\www'
      
      fs.readdir(dstPath, function(err, data){
          if(err){
              console.log(err);
              return;
          }
          data.forEach(file => {
              let currentFile = path.join(dstPath, file);
              // fs模块中的方法都是异步方法,循环已经结束,它可能还没开始,所以push没有生效
              fs.stat(currentFile, function(err, data){
                  if (err) {
                      console.log(err)
                      return;
                  }
                  if (data.isDirectory()) {
                      dirLst.push(file)
                  } else {
                      fileLst.push(file)
                  }
              })
          });
      }) 
      
      console.log(dirLst);  // []
      console.log(fileLst);  // []
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
    • 对比下面两个方法

      for (var index = 0; index < 3; index++) {
          setTimeout(()=>{
              console.log(index);
          }, 100)
      }  // 3
      
      for (let index = 0; index < 3; index++) {
          setTimeout(()=>{
              console.log(index);
          }, 100)
      }  // 1 2 3
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 2.递归处理

      const fs = require("fs")
      
      const path = require('path')
      
      var dirLst = []
      var fileLst = []
      const dstPath = 'F:\\projects\\nodejs\\demo2\\www'
      
      fs.readdir(dstPath, function(err, data){
          if(err){
              console.log(err);
              return;
          }
          (function getDir(i){
              let currentPath = path.join(dstPath, data[i])
              fs.stat(currentPath, function(err, file){
                  if (err) {
                      console.log(err)
                      return;
                  }
                  if (file.isDirectory()) {
                      dirLst.push(data[i])
                  } else {
                      fileLst.push(data[i])
                  }
                  i += 1
                  if (i >= data.length) {
                      console.log(dirLst);
                      console.log(fileLst);
                      return;
                  }
                  getDir(i)
              });
          })(0)
      }) 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
    • 3.nodejs里面的新特性(async、await

      const path = require("path");
      
      // 1.定义一个isDir的方法,判断一个资源到底是文件夹还是文件
      async function isDir(path){
          return new Promise((resolve, reject) => 
              fs.stat(path, (err, obj) => {
                  if (err) {
                      console.log(err);
                      reject(err);
                  }
                  if (obj.isDirectory()){
                      return resolve(true);
                  } else {
                      return resolve(false);
                  }
              })
          )
      }
      
      // 2.获取www里面的所有资源,循环遍历
      function getResouces() {
          let dstPath = 'F:\\projects\\nodejs\\demo2\\www'
          var dirArr = []
          fs.readdir(dstPath, async function(err, objs){
              if(err){
                  console.log(err);
                  return;
              }
      
              for (let index = 0; index < objs.length; index++) {
                  var result = await isDir(path.join(dstPath, objs[index]));
                  if (result) {
                      dirArr.push(objs[index]);
                  }
              }
              console.log(dirArr)
          })
      }
      
      getResouces();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
  • 相关阅读:
    数组乱序,前端
    grafana的前端二次开发初体验
    洗袜子的洗衣机哪款好?高性价比小型洗衣机测评
    Git 分布式版本控制工具
    为什么 C# 可能是最好的第一编程语言
    化妆品展示网页设计作业 静态HTML化妆品网站 DW美妆网站模板下载 大学生简单网页作品代码 个人网页制作 学生个人网页设计作业
    [纯理论] FPN (Feature Pyramid Network)
    【*E】leetcode-069.x的平方根
    盘点60个Python各行各业管理系统源码Python爱好者不容错过
    Visopsys 0.92 发布
  • 原文地址:https://blog.csdn.net/qq_42517220/article/details/126662175