• Node.js 入门教程 40 在 Node.js 中使用文件描述符 & 41 Node.js 文件属性 & 42 Node.js 文件路径


    Node.js 入门教程

    Node.js官方入门教程

    Node.js中文网

    本文仅用于学习记录,不存在任何商业用途,如侵删

    40 在 Node.js 中使用文件描述符

    在与位于文件系统中的文件进行交互之前,需要先获取文件的描述符。

    文件描述符是使用 fs 模块提供的 open() 方法打开文件后返回的:【有个叫进程描述符的东西】

    const fs = require('fs')
    
    
    fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
      //fd 是文件描述符。
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意,将 r 作为 fs.open() 调用的第二个参数。

    该标志意味着打开文件用于读取。

    其他常用的标志有:

    • r+ 打开文件用于读写。
    • w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
    • a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
    • a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。

    也可以使用 fs.openSync 方法打开文件,该方法会返回文件描述符(而不是在回调中提供):

    const fs = require('fs')
    
    
    try {
      const fd = fs.openSync('/Users/joe/test.txt', 'r')
    } catch (err) {
      console.error(err)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    一旦获得文件描述符,就可以以任何方式执行所有需要它的操作,例如调用 fs.open() 以及许多与文件系统交互的其他操作。

    41 Node.js 文件属性

    每个文件都带有一组详细信息,可以使用 Node.js 进行检查。

    具体地说,使用 fs 模块提供的 stat() 方法。

    调用时传入文件的路径,一旦 Node.js 获得文件的详细信息,则会调用传入的回调函数,并带上两个参数:错误消息和文件属性:

    const fs = require('fs')
    fs.stat('/Users/joe/test.txt', (err, stats) => {
      if (err) {
        console.error(err)
        return
      }
      //可以访问 `stats` 中的文件属性
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Node.js 也提供了同步的方法,该方法会阻塞线程,直到文件属性准备就绪为止:

    const fs = require('fs')
    try {
      const stats = fs.statSync('/Users/joe/test.txt')
    } catch (err) {
      console.error(err)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    文件的信息包含在属性变量中。 可以通过属性提取哪些信息?

    很多,包括:

    • 使用 stats.isFile()stats.isDirectory() 判断文件是否目录或文件。
    • 使用 stats.isSymbolicLink() 判断文件是否符号链接。
    • 使用 stats.size 获取文件的大小(以字节为单位)。

    还有其他一些高级的方法,但是在日常编程中会使用的大部分是这些。

    const fs = require('fs')
    fs.stat('/Users/joe/test.txt', (err, stats) => {
      if (err) {
        console.error(err)
        return
      }
    
    
      stats.isFile() //true
      stats.isDirectory() //false
      stats.isSymbolicLink() //false
      stats.size //1024000 //= 1MB
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    42 Node.js 文件路径

    系统中的每个文件都有路径。

    在 Linux 和 macOS 上,路径可能类似于:

    /users/joe/file.txt
    
    • 1

    在 Windows 上则有所不同,具有类似以下的结构:

    C:\users\joe\file.txt
    
    • 1

    当在应用程序中使用路径时需要注意,因为必须考虑到这种差异。

    可以使用以下方式将此模块引入到文件中:

    const path = require('path')
    
    • 1

    现在可以开始使用其方法。

    42.1 从路径中获取信息

    给定一个路径,可以使用以下方法从其中提取信息:

    • dirname: 获取文件的父文件夹。
    • basename: 获取文件名部分。
    • extname: 获取文件的扩展名。

    例如:

    const notes = '/users/joe/notes.txt'
    
    
    path.dirname(notes) // /users/joe
    path.basename(notes) // notes.txt
    path.extname(notes) // .txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    可以通过为 basename 指定第二个参数来获取不带扩展名的文件名:

    path.basename(notes, path.extname(notes)) //notes
    
    • 1

    在这里插入图片描述

    42.2 使用路径

    可以使用 path.join() 连接路径的两个或多个片段:

    const name = 'joe'
    path.join('/', 'users', name, 'notes.txt') //'/users/joe/notes.txt'
    
    • 1
    • 2

    在这里插入图片描述

    可以使用 path.resolve() 获得相对路径的绝对路径计算:

    path.resolve('joe.txt') //'/Users/joe/joe.txt' 如果从主文件夹运行。
    
    • 1

    在此示例中,Node.js 只是简单地将 /joe.txt 附加到当前工作目录。

    如果指定第二个文件夹参数,则 resolve 会使用第一个作为第二个的基础:

    path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' 如果从主文件夹运行。
    
    • 1

    如果第一个参数以斜杠开头,则表示它是绝对路径:

    path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'
    
    • 1

    path.normalize() 是另一个有用的函数,当包含诸如 ... 或双斜杠之类的相对说明符时,其会尝试计算实际的路径:

    path.normalize('/users/joe/..//test.txt') //'/users/test.txt'
    
    • 1

    解析和规范化都不会检查路径是否存在。 其只是根据获得的信息来计算路径。

  • 相关阅读:
    Dockerfile详解与实践
    场景:有一个字符串,利用这个字符串生成二维码时,发现字符串越长,生成的二维码越密集,比较难识别
    领域驱动设计:领域模型与代码模型的一致性
    KM知识文档管理系统对企业的重要性
    jQuery学习:onload和read区别(时间早晚 监听个数)
    半入耳蓝牙耳机哪款好?半入耳耳机南卡和JBL对比评测
    【AI视野·今日NLP 自然语言处理论文速览 第三十九期】Fri, 22 Sep 2023
    Qt5开发及实例V2.0-第十四章-Qt多国语言国际化
    保健品行业正在升级,你准备好了吗?
    掌握SpringMVC开发环境搭建
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128090975