Práce se systémem souborů
Ve firmě Tailwind Traders zapisují všechny prodejny součty tržeb do souboru, který pak odešlou do centrálního umístění. Aby bylo možné tyto soubory použít, musí firma vytvořit dávkový proces, který může pracovat se systémem souborů.
Tady se dozvíte, jak pomocí Node.js číst systém souborů ke zjišťování souborů a adresářů.
Zahrnutí modulu fs
Node.js poskytuje integrovaný modul fs (zkratka pro systém souborů) pro práci se systémem souborů. Protože je součástí modulu runtime Node.js, nemusíte ho instalovat; odkazujete na ni stejně jako na jakoukoli jinou závislost.
Modul fs má promises
obor názvů, který má promise
verze všech metod. promise
Použití oboru názvů je upřednostňovaným způsobem práce s modulem fs, protože umožňuje vyhnout async
se nepořádku zpětného volání nebo blokování synchronních metod.
const fs = require("fs").promises;
Pomocí modulu fs můžete provádět různé operace se soubory a adresáři. Můžete si přitom vybírat z několika metod. Prozatím se zaměříme na to, co potřebujete vědět, abyste mohli pracovat s adresáři.
Výpis obsahu v adresáři s fs.readdir
Jednou z úloh, které často provádíte s modulem fs , je výpis nebo výčet obsahu v adresáři. Například tailwind Traders má kořenovou složku s názvem stores. Tato složka obsahuje podsložky uspořádané podle čísla obchodu. Uvnitř těchto složek jsou soubory celkového prodeje. Struktura vypadá takto:
📂 stores
📄 sales.json
📄 totals.txt
📂 201
📂 202
K přečtení obsahu složky můžete použít asynchronní metodu readdir
. Většina operací v modulu fs má synchronní (postpended with Sync
) i asynchronní možnosti. Výsledky se vrátí v alfanumerickém pořadí.
const fs = require("fs").promises;
async function main() {
const items = await fs.readdir("stores");
console.log(items);
}
main();
Alfanumerický seznam položek vypadá takto:
[ '201', '202', '203', '204' ]
Určení typu obsahu pomocí isDirectory
Při čtení obsahu adresáře získáte složky a soubory ve formě pole řetězců. Předáním parametru withFileTypes
můžete určit, které z nich jsou soubory a které adresáře. Tato možnost vrátí pole Dirent
objektů místo pole řetězců. Objekt Dirent
obsahuje metody isFile
a isDirectory
, s jejichž pomocí určíte typ objektu, se kterým pracujete.
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();
Alfanumerický seznam položek vypadá takto:
201: folder
202: folder
203: folder
204: folder
Poznámka k rekurzi
Často budete muset pracovat se složitými adresářovými strukturami, které obsahují více vnořených složek, z nichž každý může obsahovat více podsložek a souborů. V takových případech potřebujete způsob, jak procházet strukturu podobné stromové struktuře, abyste našli konkrétní soubory.
Abyste toho dosáhli, můžete vytvořit funkci, která identifikuje, jestli je položka složkou. Pokud ano, funkce vyhledá v této složce další soubory. Tento proces se opakuje pro všechny nalezené složky.
Toho dosáhnete pomocí techniky označované jako rekurze, kdy funkce volá sama sebe pro vyhledávání v rámci nově nalezených složek. To umožňuje programu "procházet" celý adresářový strom a dostat se do každé vnořené složky, dokud nebudou prozkoumány všechny složky.
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));
Výstup vypadá takto:
[
'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'
]
Použití předdefinovaného vývojového prostředí
Tento trénovací modul nabízí vývojový kontejner, a to buď v prohlížeči, nebo pro místní počítač. Tento kontejner poskytuje veškeré potřebné prostředí, abyste mohli použít tento trénovací modul, aniž byste museli instalovat integrované vývojové prostředí (IDE) nebo Node.js. K dokončení tohoto trénovacího modulu nemusíte o kontejneru nic vědět.