node fs-Api 整理

973 阅读4分钟

fs-Api 整理

const fs = require('fs')

权限位 mode

因为 fs 模块需要对文件进行操作,会涉及到操作权限的问题,所以需要先清楚文件权限是什么,都有哪些权限。

文件权限表:

权限分配文件所有者文件所属组其他用户
权限项读 写 执行读 写 执行读 写 执行
字符表示r w xr w xr w x
数字表示4 2 14 2 14 2 1

文件操作权限又分为三种,读、写和执行,数字表示为八进制数,具备权限的八进制数分别为 4 、2、1,不具备权限为 0。

我们可以随便在一个目录中打开 Git,使用 Linux 命令 ls -al 来查目录中文件和文件夹的权限位

drwxr-xr-x 1 yonghu 197121 0 Jun 28 14:41 core
-rw-r--r--1 caozuozhe 197121293 Jun 23 17:44 index.md

在上面的目录信息当中,很容易看出用户名、创建时间和文件名等信息,但最重要的是开头第一项(十位的字符)。 第一位代表是文件还是文件夹,d 开头代表文件夹,- 开头的代表文件,而后面九位就代表当前用户、用户所属组和其他用户的权限位,按每三位划分,分别代表读(r)、写(w)和执行(x),- 代表没有当前位对应的权限。

权限参数 mode 主要针对 Linux 和 Unix 操作系统,Window 的权限默认是可读、可写、不可执行,所以权限位数字表示为 0o666,转换十进制表示为 438。 注:0o666是八进制

标识位 flag

NodeJS 中,标识位代表着对文件的操作方式,如可读、可写、即可读又可写等等,在下面用一张表来表示文件操作的标识位和其对应的含义。

符号含义
r读取文件,如果文件不存在则抛出异常。
r+读取并写入文件,如果文件不存在则抛出异常。
rs读取并写入文件,指示操作系统绕开本地文件系统缓存。
w写入文件,文件不存在会被创建,存在则清空后写入。
wx写入文件,排它方式打开。
w+读取并写入文件,文件不存在则创建文件,存在则清空后写入。
wx+w+ 类似,排他方式打开。
a追加写入,文件不存在则创建文件。
axa 类似,排他方式打开。
a+读取并追加写入,不存在则创建。
ax+a+ 类似,排他方式打开。
  • r:读取
  • w:写入
  • s:同步
  • +:增加相反操作
  • x:排他方式

r+ 和 w+ 的区别,当文件不存在时,r+ 不会创建文件,而会抛出异常,但 w+ 会创建文件;如果文件存在,r+ 不会自动清空文件,但 w+ 会自动把已有文件的内容清空。

fs.readFile 异步读取

fs.readFile(path[, options], callback)

path <string> | <Buffer> | <URL> | <integer> 文件名或文件描述符
options <Object> | <string>
    encoding <string> | <null> 默认值: null
    flag <string> 请参阅对文件系统 flags 的支持。 默认值: 'r'。
    signal <AbortSignal> 允许中止正在进行的读取文件
callback <Function>
    err <Error> | <AggregateError>
    data <string> | <Buffer>
    fs.readFile('input.txt', function (err, data) {
       if (err) {
           return console.error(err);
       }
       console.log("异步读取: " + data.toString());
    });

    fs.readFile(path.resolve('data1.txt'), 'utf-8', (err, data) => {
        console.log(err) 
        if (!null) {
          console.log(data)
        }
    })

fs.writeFile

fs.writeFile(file, data[, options], callback)

file <string> | <Buffer> | <URL> | <integer> 文件名或文件描述符
data <string> | <Buffer> | <TypedArray> | <DataView> | <Object>
options <Object> | <string>
    encoding <string> | <null> 默认值: 'utf8'
    mode <integer> 默认值: 0o666
    flag <string> 请参阅对文件系统 flags 的支持。 默认值: 'w'。
    signal <AbortSignal> 允许中止正在进行的写入文件
callback <Function>
    err <Error> | <AggregateError>

当 file 是文件名时,将数据异步地写入文件,如果文件已存在则替换该文件。 data 可以是字符串或缓冲区。 当 file 是文件描述符时,其行为类似于直接调用 fs.write()(推荐)。 如果 data 是缓冲区,则忽略 encoding 选项。 如果 data 是普通的对象,则它必须具有自有的(不是继承的)toString 函数属性。

    fs.writeFile('data.txt', '123', {
      mode: 438,
      flag: 'w+',
      encoding: 'utf-8'
    }, (err) => {
      if (!err) {
        fs.readFile('data.txt', 'utf-8', (err, data) => {
          console.log(data)
        })
      }
    })

    //种植写入的方法
    const controller = new AbortController();
    const { signal } = controller;
    const data = new Uint8Array(Buffer.from('Hello Node.js'));
    writeFile('message.txt', data, { signal }, (err) => {
      // 当请求中止时 - 使用 AbortError 调用回调
    });
    // 当应该中止请求时
    controller.abort();