• Node学习五(1) —— 查询和读写文件(path模块,路径处理)


    查询和读写文件之路径处理

    Node中有一组流API,可以像处理网络流一样处理文件。流API很方便,但要求只能以连续的方式处理文件。如果需要在指定位置进行读写,流API就行不通了,所以需要用到一些更底层都操作。

    本文主要内容:

    • 如何打开文件
    • 如何读取文件的指定部分
    • 如何写入文件
    • 如何关闭文件

    Node与文件有关的API很多与UNIX很像,使用文件描述符的方法就和UNIX中的一样。文件描述符句柄在Node中也是一个整数,代表进程文件描述符表的某个入口的索引。

    有三个特殊的文件描述符:

    • 1:标准输入文件(只读流,可以读取数据)
    • 2:标准输出文件(对外输出流,输出数据)
    • 3:标准错误文件(对外输出流,输出错误信息)

    一旦进程启动完毕,就能使用上述几个文件描述符,他们并不对应实际的文件。与操作网络流相似,不能在文件内指定位置读写,使用文件描述符只能连续的读写,就是说,举个例,在写的时候就不能去更改已经写入的东西了。

    文件则不受这样的限制。

    处理路径

    几乎所有对文件的操作都需要对文件路径进行处理,所以需要掌握。

    路径分为绝对路径和相对路径,这个就不再赘述。

    在Node中可以使用字符串处理路径,但是,例如当你想连接路径的不同部分时,有些是以“/”结尾而有些不是,且不同操作系统路径分隔符也不同。。。

    但是Node中有一个path模块,可以帮助你规范化、连接和解析路径,还有其他好用的一些功能。该模块只是对字符串进行处理,二不需要通过和文件系统交互来进行一些验证或功能。

    规范化路径

    由用户输入或者由配置文件获取的路径,还有多个路径连接得到的路径通常都需要规范化。

    可以使用path模块中的normalize()函数来处理,他能处理.、//等等字符。

    例如:

    const path = require("path");
    path.normalize("/foo/bar//baz/x/..");
    // 处理返回'/foo/bar/baz/x'
    
    • 1
    • 2
    • 3

    连接路径

    使用path.join()可以连接任意个路径字符串:

    const path = require(’path’);
    path.join(/foo’,’bar’,‘x/y’);
    // 处理返回:'/foo/bar/x/y'
    // 会自动规范化
    
    • 1
    • 2
    • 3
    • 4

    解析路径

    使用path.resolve()将多个路径解析为规范化的绝对路径。该函数的作用是,就像对路径挨个cd一样,不过,这里的路径可以为文件,并且可以不存在,只是对路径字符串的处理。

    const path = require('path');
    path.resolve('/foo/bar','./baz'); // /foo/bar/baz
    path.resolve('/foo/bar','/tmp/file/'); // /tmp/file
    
    • 1
    • 2
    • 3

    如果解析结果不是绝对路径,那么会将当前工作目录的路径加到前面。

    查找两个绝对路径之间的相对路径

    path.relative(/data/x/y/z‘,’/data/x/a/b’);
    // => ../../a/b
    
    • 1
    • 2

    提取路径的组成部分

    如果你在’/foo/my.md’,你想获取’/foo’里面的内容,或者读取相同目录下的其他文件,可以使用dirname获取文件路径的目录部分。

    path.dirname("/foo/bar/my.md"); // /foo/bar
    
    • 1

    而提取文件名,可以用basename。这个函数第一个接受一个路径,返回最后一个/后面的所有内容。

    他还有第二个可选参数,如果你传入文件的扩展名,那么就会返回扩展名而没有文件名。但是这样很鸡肋,你必须事先知道扩展名才能获取到。

    所以还可以用extname(),这样可以直接拿到扩展名。但是注意:

    /foo/x => ""
    /foo/x.html => ".html"
    /foo/. => ""
    /foo/x. => "."
    
    • 1
    • 2
    • 3
    • 4

    确定路径是否存在

    使用exist(),返回的是布尔值。

    注意,Node 0.8之后fs.exists代替了path.exist,二者在语义上没有区别

    const fs = require('fs');
    fs.exists("路径",function(e){
    	// 回调,e是exists的返回值,布尔值
    })
    
    • 1
    • 2
    • 3
    • 4

    因为path.exists()进行了IO操作,所以是异步的,需要回调函数。而path.existsSync(),是同步的,功能一样,但不需要回调,而是直接返回返回值。

  • 相关阅读:
    【GD32F427开发板试用】IAR 环境移植freertos
    使用PCA9685控制多个舵机
    C#应用程序界面开发基础——窗体控制(1)——Form窗体(删除事件部分,没看懂)
    猿创征文|开发常用工具
    开发思维——【小项目玩出步骤】——移动端适配和项目老大做设计
    【干货技巧】最新 Java 后端面试系列干货,都在这了!
    Vue3 SFC 和 TSX 方式自定义组件实现 v-model
    C#中实现定时器Timer定时判断IP是否ping通(连通)和端口号是否telnet可达(可用)
    Keepalived 高可用(附带配置实例,联动Nginx和LVS)
    吐血推荐:无解的完成图
  • 原文地址:https://blog.csdn.net/qq_51574759/article/details/126775251