Node.js - 檔案系統

歡迎,未來的程序员們!今天,我們將進入Node.js及其檔案系統模塊的精彩世界。作為你們友善的鄰居計算機老師,我在這裡將通過大量的範例和解釋來引導你們開始這次旅行。所以,請繫好安全帶,讓我們開始吧!

Node.js - File System

同步與異步

在我們深入檔案操作之前,讓我們先來討論兩個重要的概念:同步和異步操作。

想像你在一個咖啡店。在一個同步的世界裡,你會點一杯咖啡,等待它被製作好,然後再進行下一個任務。在一個異步的世界裡,你會點一杯咖啡,然後在咖啡師準備的時候去忙其他的事情。

在Node.js中,我們有同步和異步兩種方法進行檔案操作。讓我們看一個範例:

const fs = require('fs');

// 同步讀取
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);

// 異步讀取
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

在同步版本中,我們的程序會等待檔案被讀取後才繼續執行。在異步版本中,它會在檔案被讀取時繼續執行,然後在讀取完成後運行一個回調函數。

寫入檔案

現在,讓我們學習如何寫入一個檔案。這就像給未來的自己留下一張紙條!

const fs = require('fs');

// 同步寫入
fs.writeFileSync('note.txt', '你好,未來的我!');

// 異步寫入
fs.writeFile('note.txt', '你好,未來的我!', (err) => {
if (err) throw err;
console.log('檔案已保存!');
});

在這兩種情況下,我們都在創建(或覆寫)一個名為 'note.txt' 的檔案,內容為 "你好,未來的我!"。異步版本包括一個在檔案寫入後運行的回調函數。

讀取檔案

讀取一個檔案就像打開你給自己留下的那張紙條。讓我們看看怎麼操作:

const fs = require('fs');

// 同步讀取
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);

// 異步讀取
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});

這兩種方法都會輸出 'note.txt' 的內容。'utf8' 參數指定了檔案的編碼。

打開一個檔案

有時候,我們希望對如何與檔案交互有更多的控制。這就是 open 方法的用處:

const fs = require('fs');

// 異步打開
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('檔案成功打開!');
// 記得在完成操作後關閉檔案
fs.close(fd, (err) => {
if (err) throw err;
});
});

這會以讀模式 ('r') 打開 'myfile.txt'。回調中的 fd 是一個檔案描述符,我們將用它對檔案進行進一步的操作。

Promises API

對於那些喜歡使用 Promises(如果你不知道這是什麼,別擔心!)的人來說,Node.js 提供了一個基於 Promise 的 API 進行檔案操作:

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

async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('讀取檔案時發生錯誤:', error);
}
}

readMyFile();

這與我們之前使用異步 readFile 的範例達到相同的效果,但使用了現代的 JavaScript 語法。

獲取檔案信息

對於檔案的信息感到好奇?Node.js 會為你提供:

const fs = require('fs');

fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`檔案大小:${stats.size} bytes`);
console.log(`它是一個目錄嗎?${stats.isDirectory()}`);
console.log(`它是一個檔案嗎?${stats.isFile()}`);
});

這會給我們提供像檔案大小、它是否是目錄或檔案等信息。

關閉一個檔案

記得在完成操作後總是關閉你的檔案。這就像把牙膏蓋子蓋回去一樣!

const fs = require('fs');

fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// 進行一些操作...
fs.close(fd, (err) => {
if (err) throw err;
console.log('檔案成功關閉');
});
});

截斷一個檔案

有時候你希望保留一個檔案,但刪除其內容。這時候就可以使用截斷操作:

const fs = require('fs');

fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('檔案內容已清空!');
});

這會將檔案縮小到 0 字節,從而清除其內容。

刪除一個檔案

當你完全不再需要一個檔案時,你可以刪除它:

const fs = require('fs');

fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('檔案成功刪除');
});

使用這個時要小心 - 真實生活中沒有撤銷鍵!

創建一個目錄

需要一個新資料夾?這樣創建一個:

const fs = require('fs');

fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('目錄創建成功!');
});

讀取一個目錄

想知道一個目錄中有什麼?這樣看:

const fs = require('fs');

fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('目錄內容:');
files.forEach(file => {
console.log(file);
});
});

這會列出當前目錄中的所有檔案和子目錄。

刪除一個目錄

最後,如果你想要刪除一個目錄:

const fs = require('fs');

fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('目錄成功刪除');
});

注意,這只對空目錄有效。

方法參考

這裡是我們討論過的方法的便捷參考表:

方法 描述
readFile 讀取一個檔案的整個內容
writeFile 寫入數據到一個檔案,如果檔案已存在則替換
open 打開一個檔案以供讀取或寫入
close 關閉一個檔案描述符
stat 獲取關於一個檔案的信息
truncate 將一個檔案截斷到指定的長度
unlink 刪除一個檔案
mkdir 創建一個新目錄
readdir 讀取一個目錄的內容
rmdir 刪除一個目錄

以上就是Node.js中檔案系統操作的基本內容。記住,熟練來自練習,所以不要害怕嘗試這些方法。快樂編程!

Credits: Image by storyset