Node.js - 檔案系統
歡迎,未來的程序员們!今天,我們將進入Node.js及其檔案系統模塊的精彩世界。作為你們友善的鄰居計算機老師,我在這裡將通過大量的範例和解釋來引導你們開始這次旅行。所以,請繫好安全帶,讓我們開始吧!
同步與異步
在我們深入檔案操作之前,讓我們先來討論兩個重要的概念:同步和異步操作。
想像你在一個咖啡店。在一個同步的世界裡,你會點一杯咖啡,等待它被製作好,然後再進行下一個任務。在一個異步的世界裡,你會點一杯咖啡,然後在咖啡師準備的時候去忙其他的事情。
在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