在開發桌面應用或處理本地文件時,我們經常需要與文件系統進行互動。
Node.js 提供了強大的 fs 模組來處理文件的讀寫、目錄操作、文件狀態檢查等功能。本篇文章將介紹一些常見的文件系統操作,並展示如何通過 Node.js 實現這些操作。
fs/promises
模組Node.js 提供了兩種方式來操作文件系統:同步 (sync) 和 異步 (async)。這裡我們推薦使用異步 API,因為它不會阻塞應用程序。Node.js 內建的 fs/promises
模組提供了 Promise 風格的文件操作方法,讓代碼更加清晰。
import { promises as fs } from 'fs';
你可以使用 fs.writeFile()
方法來創建或覆蓋文件,並將數據寫入其中。
// 創建一個文件並寫入內容
const createFile = async () => {
try {
await fs.writeFile('./data.txt', '這是一段測試數據', 'utf-8');
console.log('文件創建並成功寫入內容');
} catch (error) {
console.error('寫入文件時出錯', error);
}
};
createFile();
使用 fs.readFile()
可以讀取文件的內容,並將其作為字符串返回。
// 讀取文件內容
const readFile = async () => {
try {
const data = await fs.readFile('./data.txt', 'utf-8');
console.log('文件內容:', data);
} catch (error) {
console.error('讀取文件時出錯', error);
}
};
readFile();
如果你想在現有的文件中添加內容,而不覆蓋原有數據,可以使用 fs.appendFile()
。
// 在文件後面附加內容
const appendToFile = async () => {
try {
await fs.appendFile('./data.txt', '\n這是追加的一行內容', 'utf-8');
console.log('內容已附加到文件');
} catch (error) {
console.error('附加內容時出錯', error);
}
};
appendToFile();
刪除文件可以使用 fs.unlink()
方法。
// 刪除文件
const deleteFile = async () => {
try {
await fs.unlink('./data.txt');
console.log('文件已刪除');
} catch (error) {
console.error('刪除文件時出錯', error);
}
};
deleteFile();
除了文件,Node.js 也提供了操作目錄的 API,包括創建、讀取目錄列表等。
使用 fs.mkdir()
可以創建一個新的目錄。你可以選擇是否遞迴創建多層級的目錄。
// 創建單一目錄
const createDirectory = async () => {
try {
await fs.mkdir('./test-directory');
console.log('目錄已創建');
} catch (error) {
console.error('創建目錄時出錯', error);
}
};
createDirectory();
如果目錄中包含多個層級,可以使用 { recursive: true }
選項來遞迴創建。
// 遞迴創建多層級目錄
const createNestedDirectory = async () => {
try {
await fs.mkdir('./nested/dir/path', { recursive: true });
console.log('多層級目錄已創建');
} catch (error) {
console.error('創建多層級目錄時出錯', error);
}
};
createNestedDirectory();
使用 fs.readdir()
可以讀取目錄中的文件和子目錄列表。
// 讀取目錄內容
const readDirectory = async () => {
try {
const files = await fs.readdir('./test-directory');
console.log('目錄內容:', files);
} catch (error) {
console.error('讀取目錄內容時出錯', error);
}
};
readDirectory();
刪除目錄可以使用 fs.rmdir()
,當刪除目錄時需要確保目錄是空的。如果目錄不空,可以使用 { recursive: true }
選項來遞迴刪除非空目錄。
// 刪除空目錄
const deleteDirectory = async () => {
try {
await fs.rmdir('./test-directory');
console.log('目錄已刪除');
} catch (error) {
console.error('刪除目錄時出錯', error);
}
};
deleteDirectory();
如果要遞迴刪除非空目錄,可以這樣做:
// 遞迴刪除非空目錄
const deleteNestedDirectory = async () => {
try {
await fs.rmdir('./nested', { recursive: true });
console.log('非空目錄已刪除');
} catch (error) {
console.error('刪除非空目錄時出錯', error);
}
};
deleteNestedDirectory();
要檢查文件或目錄是否存在,可以使用 fs.access()
。這個方法會根據權限檢查文件是否可讀、可寫。
// 檢查文件或目錄是否存在
const checkExistence = async (path) => {
try {
await fs.access(path);
console.log(`${path} 存在且可訪問`);
} catch (error) {
console.error(`${path} 不存在或不可訪問`);
}
};
checkExistence('./data.txt');
使用 fs.stat()
可以獲取文件或目錄的詳情,如文件大小、創建時間等。
// 檢查文件狀態
const checkFileStat = async () => {
try {
const stats = await fs.stat('./data.txt');
console.log('文件資訊:', stats);
} catch (error) {
console.error('檢查文件狀態時出錯', error);
}
};
checkFileStat();
你可以檢查 stats
的 isFile()
或 isDirectory()
方法來確定是文件還是目錄。
除了基本的讀取和寫入方法,Node.js 的 fs
模組還提供了流的方式來處理大型文件。
fs.createReadStream()
方法允許你以流的方式讀取文件內容,特別適合於處理大型文件,因為它不會一次性將文件讀入記憶體。
import { createReadStream } from 'fs';
// 創建文件讀取串流
const readStream = createReadStream('./large-file.txt', { encoding: 'utf-8' });
readStream.on('data', (chunk) => {
console.log('讀取到的數據:', chunk);
});
readStream.on('end', () => {
console.log('文件讀取完畢');
});
readStream.on('error', (error) => {
console.error('讀取文件時出錯', error);
});
fs.createWriteStream()
允許你以流的方式將數據寫入文件,這在處理大數據集或需要持續寫入數據時非常有用。
import { createWriteStream } from 'fs';
// 創建文件寫入串流
const writeStream = createWriteStream('./output.txt', { encoding: 'utf-8' });
writeStream.write('這是一行寫入的數據\n');
writeStream.write('這是第二行\n');
writeStream.end(); // 結束寫入串流
writeStream.on('finish', () => {
console.log('文件寫入完成');
});
writeStream.on('error', (error) => {
console.error('寫入文件時出錯', error);
});
在這篇文章中,我們介紹了如何使用 Node.js 的 fs
模組來操作本地文件系統,涵蓋了文件的創建、讀取、寫入、刪除、目錄操作、檢查文件狀態,以及流操作的功能
無論是處理小型文件還是大型文件,Node.js 的 fs
模組都為開發者提供了強大的工具,使得文件系統操作變得簡單高效。