極簡 Node.js 入門 - 3.3 檔案寫入

謙行發表於2020-08-22

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

本文更佳閱讀體驗:https://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 章節會有詳細介紹

相關文章