Práce se systémem souborů

Dokončeno

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 fspromises 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.

Prověřte si své znalosti

1.

Které z následujících operací můžete dělat s modulem fs?