處理檔案系統

已完成

Tailwind Traders 的每間商店都會將其銷售總額寫入檔案,並將該檔案傳送到中央位置。 若要使用這些檔案,公司必須建立可與檔案系統搭配使用的批次程序。

在這裡,您會了解如何使用 Node.js 來讀取檔案系統,以探索檔案與目錄。

納入 fs 模組

Node.js 提供內建模組 fs (檔案系統簡短),用於處理文件系統。 因為它是 Node.js 運行時間的一部分,所以您不需要安裝它;您參考它就像任何其他相依性一樣。

fs 模組具有promises具有promise所有方法版本的命名空間。 promise使用 命名空間是使用 fs 模組的慣用方法,因為它可讓您使用 async 來避免回呼混亂或同步方法的封鎖。

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

您可以使用 fs 模組在檔案與目錄上執行各種作業。 其有數種方法可供挑選。 目前,我們將著重於使用目錄時需要知道的內容。

使用 fs.readdir 列出目錄中的內容

您可以使用 fs 模組來執行的其中一個工作是列出或 列舉目錄中的內容。 例如,Tailwind Traders 有一個稱為 stores 的根資料夾。 該資料夾中有依商店編號組織的子資料夾。 那些子資料夾內即為銷售總額檔案。 結構看起來如下:

📂 stores
    📄 sales.json
    📄 totals.txt
    📂 201
    📂 202

若要讀取資料夾的內容,您可以使用異步 readdir 方法。 fs 模組上的大部分作業都同時具有同步的 (加上後置Sync的 ) 和異步選項。 結果會以英數位元順序傳回。

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

async function main() {
    const items = await fs.readdir("stores");
    console.log(items);
}
main();

以英數位元排序的項目清單如下所示:

[ '201', '202', '203', '204' ]

使用 isDirectory 判斷內容類型

當讀取目錄的內容時,會以字串陣列的形式取回資料夾和檔案。 您可以透過傳入 withFileTypes 選項,以判斷哪些是檔案,哪些是目錄。 此選項會傳回 Dirent 物件的陣列,而非字串陣列。 Dirent 物件具有 isFileisDirectory 方法,可用來判斷您正在處理的物件類型。

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

async function main() {
    const items = await fs.readdir("stores", { withFileTypes: true });
    for (let item of items) {
        const type = item.isDirectory() ? "folder" : "file";
        console.log(`${item.name}: ${type}`);
    }
}
main();

以英數位元排序的項目清單如下所示:

201: folder
202: folder
203: folder
204: folder

遞迴的相關注意事項

通常,您可能需要使用包含多個巢狀資料夾的複雜目錄結構,每個結構都可能包含更多子資料夾和檔案。 在這種情況下,您需要一種方法來巡覽此類似樹狀的結構,以尋找特定檔案。

若要達成此目的,您可以建立可識別專案是否為資料夾的函式。 如果是,函式會在該資料夾中搜尋更多檔案。 找到的每個資料夾都會重複此程式。

這可藉由使用稱為 遞歸的技術來達成,其中函式會呼叫自己在新找到的資料夾內搜尋。 這可讓程式「逐步解說」整個目錄樹狀結構,到達每個巢狀資料夾,直到探索所有資料夾為止。

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

async function findFiles(folderName) {

    let results = []

    results.push(`${folderName}`);

    const items = await fs.readdir(folderName, { withFileTypes: true });

    for (const item of items) {
        if (item.isDirectory()) {

            // RECURSION - calling the function from within itself
            const resultsReturned = await findFiles(`${folderName}/${item.name}`);
            results = results.concat(resultsReturned);
        } else {
            results.push(`${folderName}/${item.name}`);
        }
    }

    return results;
}

findFiles("stores").then((results) => console.log(results));

輸出如下所示:

[
  'stores',
  'stores/201',
  'stores/201/sales.json',
  'stores/202',
  'stores/202/sales.json',
  'stores/203',
  'stores/203/sales.json',
  'stores/204',
  'stores/204/sales.json'
]

使用預先定義的開發環境

此訓練模組會在瀏覽器中或本機計算機提供開發容器。 此容器提供所有必要的環境,因此您可以使用此訓練模組,而不需要安裝IDE或 Node.js。 您不需要知道容器的任何專案,即可完成此訓練課程模組。

檢定您的知識

1.

您可使用 fs 模組來處理下列哪一項作業?