使用 Node.js 讀取及寫入檔案

前言

在瀏覽器中的 JavaScript 是不具有操作檔案的能力的,但在 Node.js 中提中了多個 API,支援檔案操作的功能

使用

認識 Node.js 這一篇中提到 Node.js 提供了一系列的核心模組,當中有一個操作文件的模組名為 fs 模組,fs 為 file system 的簡寫,顧名思義,這個模組包含了原生 Node.js 提供的檔案操作相關 API。

使用 require 載入 fs 模組

1
var fs = require('fs')

readFile() 讀取文件

目前的資料夾結構:
nodejs
 ∟ main.js
 ∟ hello.txt

hello.txt 中寫下以下的文字,然後我們嘗試來把這份文件的內容給讀出來

1
我是在 hello.txt 內的字串

fs 模組所提供的 readFile API 提供讀取文件的功能,並且須帶入兩個參數

  1. 欲讀取檔案的路徑
  2. callback function,如認識 Node.js 中所提,Node.js 提供了大量非同步的 API,情況就類似於這個例子。這個 callback 也提供兩個參數:
    1. 當檔案讀取成功時: 
      • data → 檔案內的二進制數據
      • error → null
    2. 當檔案讀取失敗時(如路徑錯誤,或是檔案不存在):
      • data → undefined
      • error → 一個物件
1
2
3
4
5
6
7
8
9
// main.js
fs.readFile('./hello.txt', function (error, data) {
// 若錯誤 error 為一個物件,則會在這邊觸發內部程式碼,作為簡單的錯誤處理
if (error) {
console.log('讀取檔案失敗')
return
}
console.log(data)
})

執行

1
node main

輸出結果

1
<Buffer e6 88 91 e6 98 af e5 9c a8 20 68 65 6c 6c 6f 2e 74 78 74 20 e5 85 a7 e7 9a 84 e5 ad 97 e4 b8 b2>

如前面所提及,readFile API 預設讀出來的結果為該檔案內容的二進制數據(輸出結果為16進制,是因為二進制又被轉為16進制了),若要將它轉換為正常內容可以使用 JS 的toString() API

1
console.log(data.toString())

輸出結果

1
我是在 hello.txt 內的字串

試著故意將欲讀取檔案的路徑寫錯,印出 error 來看看是怎麼回事吧

1
2
3
4
5
6
7
8
// main.js
fs.readFile('hahaha', function (error, data) {
if (error) {
console.log(error)
return
}
console.log(data)
})

輸出結果為一個物件

1
2
3
4
5
{ Error: ENOENT: no such file or directory, open 'C:\Users\Dylanliu\Desktop\nodejs\hahaha']
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\Dylanliu\\Desktop\\nodejs\\hahaha' }

writeFile() 寫入文件

目前的資料夾結構:
nodejs
 ∟ main.js

writeFile API 提供寫入文件的功能,並且須帶入三個參數

  1. 欲寫入的資料夾路徑,及生成的檔案名
  2. 檔案內容
  3. callback function,接受一個 error 參數
    1. 當檔案寫入成功時: error → null
    2. 當檔案寫入失敗時: error → 一個物件
1
2
3
4
fs.writeFile('./hello.md', '# 我是被寫入的檔案',function (error) {
console.log(error)
console.log('文件寫入成功')
})

輸出結果

試著將檔名改為不合規格的名稱,測試看看失敗時 error 物件是什麼

1
2
3
fs.writeFile('./>>.md', '# 我是被寫入的檔案',function (error) {
console.log(error)
})

一樣產生了一個代表錯誤的物件

1
2
3
4
5
{ Error: ENOENT: no such file or directory, open 'C:\Users\Dylanliu\Desktop\nodejs\>>.md']
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\Dylanliu\\Desktop\\nodejs\\>>.md' }

別忘了做一個簡單的錯誤時處理

1
2
3
4
5
6
7
fs.writeFile('./>>.md', '# 我是被寫入的檔案',function (error) {
if (error) {
console.log('文件寫入失敗')
} else {
console.log('寫入成功')
}
})