• 技术文章 >web前端 >js教程

    浅析node中的常用模块:path模块和fs模块

    青灯夜游青灯夜游2022-03-31 20:34:23转载94
    node中还有很多内置对象,可以帮助我们进行很多操作,包括对路径、文件等操作。下面本篇文章给大家介绍一下node常用内置模块中的path模块和fs模块,希望对大家有所帮助!

    path模块

    path模块用于对路径和文件进行处理,提供了很多方法。

    path.resolve

    有一个需求是将路径和文件名进行拼接。

    const basePath = '/user/why'
    const filename = 'abc.txt'

    那么有人会使用字符串拼接的方式进行拼接。

    const filePath = basePath + '/' + filename
    console.log(filePath);

    这样的结果虽然没有问题,但是考虑到不同的系统,windows系统可以使用\或者\\或者/作为路径分隔符,而Mac OS、Linux的Unix操作系统使用/作为路径分隔符。

    1.png

    解决上述问题,我们可以使用path.resolve来进行路径的拼接。

    const path = require('path')
    
    const basePath = '/user/why'
    const filename = 'abc.txt'
    
    const filePath = path.resolve(basePath, filename)
    
    console.log(filePath);

    2.png

    从路径中获取信息

    const path = require('path')
    
    const filePath = '/User/haha/abc.txt'
    
    console.log(path.dirname(filePath));
    console.log(path.basename(filePath));
    console.log(path.extname(filePath));

    3.png

    路径拼接

    如果我们想要把多个路径进行拼接,但是不同的操作系统可能使用不同的分隔符,我们可以使用path.join函数。

    const path = require('path')
    
    const basepath = '/User/haha'
    const filename = 'abc.txt'
    
    const filePath = path.join(basepath, filename)
    console.log(filePath);

    4.png

    将文件和某个文件夹拼接

    如果我们想要将某个文件和文件夹拼接,可以使用path.resolve。

    const basepath = 'User/haha'
    const filename = 'abc.txt'

    5.png

    path.resolve和path.join一样也可以进行路径的拼接,那么它们的区别是什么呢?

    const basepath = '../User/haha'
    const filename = './abc.txt'
    const othername = './haha.js'
    
    const filePath1 = path.join(basepath, filename, othername)
    console.log(filePath1);
    
    const filePath2 = path.resolve(basepath, filename, othername)
    console.log(filePath2);

    我们可以看到它们的差别。

    6.png

    fs模块

    nodejs文件系统的API大都提供三种操作方式:

    读取文件状态(信息)

    方式一 同步操作:fs.statSync

    const fs = require('fs')
    
    const filepath = './abc.txt'
    const info = fs.statSync(filepath)
    console.log('后续需要执行的代码');
    console.log(info);

    7.png

    方式二 异步操作

    fs.stat(filepath, (err, info) => {
      if(err) {
        console.log(err);
        return
      }
      console.log(info);
      console.log(info.isFile()); // 判断是否是一个文件
      console.log(info.isDirectory()); // 判断是否是一个文件夹
    })
    console.log('后续需要执行的代码');

    方式三: Promise

    fs.promises.stat(filepath).then(info => {
      console.log(info);
    }).catch(err => {
      console.log(err);
    })
    
    console.log('后续需要执行的代码');

    文件描述符

    node为所有打开的文件分配了一个数字型的文件描述符。所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。

    fs.open()方法用于分配新的文件描述符fd。一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据、或请求关于文件的信息。

    const fs = require('fs')
    
    fs.open('./abc.txt', (err, fd) => {
      if(err) {
        console.log(err);
        return
      }
    
      // 通过文件描述符去获取文件信息
      fs.fstat(fd, (err, info) => {
        console.log(info);
      })
    })

    文件的读写

    fs.readFile(path[, options], callback):读取文件内容

    fs.writeFile(path[, options], callback):往文件中写入内容

    option参数:

    flag: 写入的方式

    encoding:字符的编码

    文件的写入

    fs.writeFile('./abc.txt', content, {flag: "a"}, err => {
      console.log(err);
    })

    文件的读取

    fs.readFile('./abc.txt', (err, data) => {
      console.log(data);
    })

    如果不填写encoding,返回的结果Buffer(二进制)。

    8.png

    fs.readFile('./abc.txt', {encoding: 'utf-8'}, (err, data) => {
      console.log(data);
    })

    9.png

    创建文件夹

    使用fs.mkdir()或者fs.mkdirSync创建一个新的文件夹。

    const fs = require('fs')
    
    // 创建文件夹
    const dirname = './haha'
    if(!fs.existsSync(dirname)) {
      fs.mkdir(dirname, (err) => {
        console.log(err);
      })
    }

    获取文件夹的内容

    fs.readdir

    fs.readdir(dirname, (err, files) => {
      console.log(files);
    })

    获取文件夹中的所有文件,此时目录如下图所示,可以使用递归。

    10.png

    const fs = require('fs')
    const path = require('path')
    const dirname = './haha'
    
    function getFiles(dirname) {
      fs.readdir(dirname, {withFileTypes: true}, (err, files) => {
        // console.log(files);
        for(let file of files) {
          // 判断是否是文件夹
          if(file.isDirectory()) {
            const filepath = path.resolve(dirname, file.name)
            getFiles(filepath)
          } else {
            console.log(file.name);
          }
        }
      })
    }
    
    getFiles(dirname)

    重命名

    可以使用fs.rename对文件夹进行重命名。

    fs.rename('./haha', './xixi', err => {
      console.log(err);
    })

    更多node相关知识,请访问:nodejs 教程

    以上就是浅析node中的常用模块:path模块和fs模块的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    上一篇:es6中promise对象的状态有哪些 下一篇:带你学习JavaScript中的File API、Streams API和Web Cryptography API
    PHP编程就业班

    相关文章推荐

    • 什么是libuv,浅析libuv中的事件轮询(Node核心依赖)• 简单对比Node中的setHeader和writeHead,聊聊差异• 实战分享:利用nodejs​爬取并下载一万多张图片• 什么是事件循环?详解Node.js中的事件循环• 聊聊Node.js stream 模块,看看如何构建高性能的应用

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网