node.js v16.13.1 fs文件读写

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

支持回调的api 回调api异步地执行所有操作,不会阻塞事件循环,然后在完成或错误时调用回调函数。回调api使用底层node.js线程池在事件循环线程之外执行文件系统操作。这些操作不是同步的也不是线程安全的。对同一文件执行多个并发修改时必须小心,否则会损害数据。

1. fs.access(path[,mode], callback)

测试用户对path指定的文件或目录的权限。mode参数是可选的整数,指定要执行的可访问性检查。查看文件访问的常量以获取可能的mode值。最后一个参数callback是回调函数,其使用一个可能的错误参数调用。如果任何可访问性检查失败,则错误参数将是Error对象。

import { open, close } from 'fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

注: 在调用fs.open()、fs.readFile()或fs.writeFile()之前,不要使用fs.accesss()检查文件的可访问性。会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。而是,用户代码应直接打开/读取、写入文件,并处理无法访问文件时引发的错误。

2. fs.appendFile(path, data[,option],callback)

异步地将数据追加到文件,如果该文件尚不存在,则创建该文件。data可以为字符串或<buffer>

import { appendFile } from 'fs';

appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
});
import { appendFile } from 'fs';

appendFile('message.txt', 'data to append', 'utf8', callback);

可以将path指定为已打开用于追加(使用fs.open()或fs.openSync())的数字文件描述符。文件描述符不会自动关闭。

import { open, close, appendFile } from 'fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('message.txt', 'a', (err, fd) => {
  if (err) throw err;

  try {
    appendFile(fd, 'data to append', 'utf8', (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
});

3. fs.close(fd[, callback])

关闭文件描述符。除了可能的异常之外,没有为完成回调提供任何参数。通过任何其他fs操作对当前正在使用的任何文件描述符(fs)调用fs.close(),可能会导致为定义的行为。

4. fs.open(path[,flags[,mode]],callback)

异步地打开文件,回调有两个参数(err, fd)

5. fs.read(fd,buffer, offset, length, position, callback)

fd: 从fd指定的文件中读取数据。回调被赋予三个参数,(err, bytesRead, buffer)。

6. fs.read(fd,[options,] callback)

options是对象。

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

异步地读取文件的全部内容。回调传入了两个参数(err, data),其中data是文件的内容。如果为指定编码,则返回原始缓冲区。如果options是字符串,则它指定编码

import { readFile } from 'fs';

readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});
import { readFile } from 'fs';

readFile('/etc/passwd', 'utf8', callback);

fs.readFile()函数缓冲整个文件。为了最小化内存成本,在可能的情况下优先通过fs.createReadStream()进行流式传输。

8. fs.createReadStream(path[, options])

image.png

与stream.Readable的16kb默认highWaterMark不同,此方法返回的流的默认highWaterMark为64kb。 options包括start和end值,以从文件中读取一定范围的字节,而不是整个文件。start和end都包含在内并且从0开始计数,允许的值在[0, Number.MAX_SAFE_INTEGER]范围内。如果指定了fd并且start被省略或undefined,则fs.createReadStream()从当前文件位置顺序读取。encoding可以是buffer接收的任何一种。 如果指定了fd,则ReadStream将忽略path参数并使用指定的文件描述符。默认情况下,流将在销毁后触发