極簡 Node.js 入門 - 3.3 文件寫入

極簡 Node.js 入門系列教程://www.yuque.com/sunluyong/node

本文更佳閱讀體驗://www.yuque.com/sunluyong/node/fs-write

看完文件讀取再看文件寫入非常簡單,兩者的操作幾乎一一對應

fs.writeFile

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

  1. file:文件名或文件描述符
  2. data:常用的主要是 string 和 buffer
  3. callback(err)

當 file 是文件名時,則非同步地寫入數據到文件,如果文件已存在,則覆蓋文件內容

const fs = require('fs');

const data = Buffer.from('Hello, Node.js');
fs.writeFile('./test.txt', data, err => {
  if (err) throw err;
  console.log('文件已被保存');
});

fs.write

fs.write 有兩種重載

  1. fs.write(fd, buffer[, offset[, length[, position]]], callback):參數含義和 fs.read 幾乎相同
  2. fs.write(fd, string[, position[, encoding]], callback):只能把字元串內容全部寫入文件

兩個的區別就是適用 buffer 可以治寫入 buffer 中 offset ~ length + offset 的內容,而使用字元串只能把字元串內容全部寫入文件

const fs = require('fs');

const data1 = Buffer.from('Hello, Node.js');
const data2 = 'Hello, Node.js';

const fd = fs.openSync('./test.txt', 'w');
console.log(fd)

fs.write(fd, data1, err => {
  if (err) throw err;
  console.log('data1 已被寫入');
});

fs.write(fd, data2, err => {
  if (err) throw err;
  console.log('data2 已被寫入');
});

setTimeout(() => {
  fs.close(fd, console.log);
}, 100);

fs.appendFile

fs.appendFile(path, data[, options], callback) 將數據追加到文件尾部,如果文件不存在則創建該文件

const fs = require('fs/promises');

const data1 = Buffer.from('Hello,');
const data2 = Buffer.from(' Node.js');

fs.appendFile('./test.txt', data1)
  .then(() => {
    fs.appendFile('./test.txt', data2);
    console.log('文件內容追加完成');
  });

fs.createWriteStream

fs.createWriteStream(path[, options]) 用來創建一個可寫的文件流,options 和 fs.createReadStream 幾乎相同
options(比較常用的有)

  • fd: 默認值 null,如果指定了 fd,則會忽略 path 參數,使用指定的文件描述符(不會再次觸發 open 事件)
  • mode:默認值 0o666
  • autoClose: 默認值: true,當 'error' 或 'finish' 事件時,文件描述符會被自動地關閉
  • start: 開始寫入文件的位置,不設置默認覆蓋


把一個可讀流內容寫到可寫流非常簡單

const fs = require('fs');

fs.createReadStream('./test.txt')
  .pipe(fs.createWriteStream('./copy.txt'));

關於流的介紹和更多使用在 Buffer 和 Stream 章節會有詳細介紹

Tags: