iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0
Modern Web

從 0 到 1:30 篇文章帶你玩轉 Electron 與 React系列 第 11

使用 Node.js 操作本地文件系統

  • 分享至 

  • xImage
  •  

在開發桌面應用或處理本地文件時,我們經常需要與文件系統進行互動。

Node.js 提供了強大的 fs 模組來處理文件的讀寫、目錄操作、文件狀態檢查等功能。本篇文章將介紹一些常見的文件系統操作,並展示如何通過 Node.js 實現這些操作。

1. 匯入 fs/promises 模組

Node.js 提供了兩種方式來操作文件系統:同步 (sync)異步 (async)。這裡我們推薦使用異步 API,因為它不會阻塞應用程序。Node.js 內建的 fs/promises 模組提供了 Promise 風格的文件操作方法,讓代碼更加清晰。

import { promises as fs } from 'fs';

2. 文件操作

2.1 創建並寫入文件

你可以使用 fs.writeFile() 方法來創建或覆蓋文件,並將數據寫入其中。

// 創建一個文件並寫入內容
const createFile = async () => {
  try {
    await fs.writeFile('./data.txt', '這是一段測試數據', 'utf-8');
    console.log('文件創建並成功寫入內容');
  } catch (error) {
    console.error('寫入文件時出錯', error);
  }
};

createFile();

2.2 讀取文件

使用 fs.readFile() 可以讀取文件的內容,並將其作為字符串返回。

// 讀取文件內容
const readFile = async () => {
  try {
    const data = await fs.readFile('./data.txt', 'utf-8');
    console.log('文件內容:', data);
  } catch (error) {
    console.error('讀取文件時出錯', error);
  }
};

readFile();

2.3 附加內容到文件

如果你想在現有的文件中添加內容,而不覆蓋原有數據,可以使用 fs.appendFile()

// 在文件後面附加內容
const appendToFile = async () => {
  try {
    await fs.appendFile('./data.txt', '\n這是追加的一行內容', 'utf-8');
    console.log('內容已附加到文件');
  } catch (error) {
    console.error('附加內容時出錯', error);
  }
};

appendToFile();

2.4 刪除文件

刪除文件可以使用 fs.unlink() 方法。

// 刪除文件
const deleteFile = async () => {
  try {
    await fs.unlink('./data.txt');
    console.log('文件已刪除');
  } catch (error) {
    console.error('刪除文件時出錯', error);
  }
};

deleteFile();

3. 目錄操作

除了文件,Node.js 也提供了操作目錄的 API,包括創建、讀取目錄列表等。

3.1 創建目錄

使用 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();

3.2 讀取目錄內容

使用 fs.readdir() 可以讀取目錄中的文件和子目錄列表。

// 讀取目錄內容
const readDirectory = async () => {
  try {
    const files = await fs.readdir('./test-directory');
    console.log('目錄內容:', files);
  } catch (error) {
    console.error('讀取目錄內容時出錯', error);
  }
};

readDirectory();

3.3 刪除目錄

刪除目錄可以使用 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();

4. 檢查文件或目錄是否存在

要檢查文件或目錄是否存在,可以使用 fs.access()。這個方法會根據權限檢查文件是否可讀、可寫。

// 檢查文件或目錄是否存在
const checkExistence = async (path) => {
  try {
    await fs.access(path);
    console.log(`${path} 存在且可訪問`);
  } catch (error) {
    console.error(`${path} 不存在或不可訪問`);
  }
};

checkExistence('./data.txt');

4.1 檢查文件或目錄的狀態

使用 fs.stat() 可以獲取文件或目錄的詳情,如文件大小、創建時間等。

// 檢查文件狀態
const checkFileStat = async () => {
  try {
    const stats = await fs.stat('./data.txt');
    console.log('文件資訊:', stats);
  } catch (error) {
    console.error('檢查文件狀態時出錯', error);
  }
};

checkFileStat();

你可以檢查 statsisFile()isDirectory() 方法來確定是文件還是目錄。


5. 文件流操作

除了基本的讀取和寫入方法,Node.js 的 fs 模組還提供了流的方式來處理大型文件。

5.1 創建讀取串流

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);
});

5.2 創建寫入串流

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.jsfs 模組來操作本地文件系統,涵蓋了文件的創建、讀取、寫入、刪除、目錄操作、檢查文件狀態,以及流操作的功能

無論是處理小型文件還是大型文件,Node.js 的 fs 模組都為開發者提供了強大的工具,使得文件系統操作變得簡單高效。


上一篇
視窗 API 大集合(進階篇)
下一篇
狀態管理:原理及工具介紹
系列文
從 0 到 1:30 篇文章帶你玩轉 Electron 與 React30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言