處理檔案系統
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
物件具有 isFile
與 isDirectory
方法,可用來判斷您正在處理的物件類型。
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。 您不需要知道容器的任何專案,即可完成此訓練課程模組。