Met het bestandssysteem werken

Voltooid

Bij Tailwind Traders laten ze elke winkel hun totale verkoop naar een bestand schrijven en moet de winkel dat bestand naar een centrale locatie verzenden. Voor het gebruik van deze bestanden moet het bedrijf een batchproces maken dat met het bestandssysteem kan werken.

Hier leert u hoe u Node.js gebruikt om het bestandssysteem te lezen om bestanden en mappen te detecteren.

De fs-module opnemen

Node.js biedt een ingebouwde module, fs (kort voor bestandssysteem), voor het werken met het bestandssysteem. Omdat het deel uitmaakt van de Node.js-runtime, hoeft u deze niet te installeren; u verwijst er net zo naar als elke andere afhankelijkheid.

De fs-module heeft een promises naamruimte met promise versies van alle methoden. Het gebruik van de promise naamruimte is de voorkeurswijze om met de fs-module te werken, omdat u async hiermee de compatibiliteit van callbacks of het blokkeren van synchrone methoden kunt voorkomen.

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

U kunt de fs-module gebruiken om verschillende bewerkingen uit te voeren op bestanden en directory's. Er zijn verschillende methoden waaruit u kunt kiezen. Voorlopig richten we ons op wat u moet weten om met directory's te werken.

Inhoud weergeven in een map met fs.readdir

Een taak die u vaak met de fs-module doet, is de inhoud in een map opsommen of opsommen . Tailwind Traders heeft bijvoorbeeld een hoofdmap met de naam Stores. In die map zijn submappen gerangschikt op winkelnummer. In deze mappen bevinden zich de totale verkoopbestanden. De structuur ziet er als volgt uit:

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

Als u de inhoud van de map wilt lezen, kunt u de asynchrone readdir methode gebruiken. De meeste bewerkingen op de fs-module hebben zowel synchrone (postpended met Sync) als asynchrone opties. De resultaten worden geretourneerd in alfanumerieke volgorde.

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

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

De alfanumeriek gesorteerde lijst met items ziet er als volgt uit:

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

Inhoudstype bepalen met isDirectory

Wanneer u de inhoud van een directory leest, krijgt u zowel mappen als bestanden terug als een matrix van tekenreeksen. U kunt bepalen welke tekenreeksen bestanden zijn en welke directory's door de withFileTypes-optie door te geven. Met deze optie wordt een matrix met Dirent objecten geretourneerd in plaats van een matrix met tekenreeksen. Het Dirent-object heeft isFile- en isDirectory-methoden die u kunt gebruiken om te bepalen met welke type object u te maken hebt.

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

De alfanumeriek gesorteerde lijst met items ziet er als volgt uit:

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

Een opmerking over recursie

Vaak moet u mogelijk werken met complexe mapstructuren die meerdere geneste mappen bevatten, elk mogelijk met meer submappen en bestanden. In dergelijke gevallen hebt u een manier nodig om door deze structuurachtige structuur te navigeren om specifieke bestanden te vinden.

Hiervoor kunt u een functie maken die aangeeft of een item een map is. Als dat zo is, zoekt de functie in die map naar meer bestanden. Dit proces wordt herhaald voor elke map die wordt gevonden.

Dit wordt bereikt met behulp van een techniek die recursie wordt genoemd, waarbij de functie zichzelf aanroept om te zoeken in de zojuist gevonden mappen. Hierdoor kan het programma de hele mapstructuur doorlopen, waarbij elke geneste map wordt bereikt totdat alle mappen zijn verkend.

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

De uitvoer ziet er als volgt uit:

[
  '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'
]

Een vooraf gedefinieerde ontwikkelomgeving gebruiken

Deze trainingsmodule biedt een ontwikkelcontainer in een browser of voor uw lokale computer. Deze container biedt alle benodigde omgevingen, zodat u deze trainingsmodule kunt gebruiken zonder dat u een IDE of Node.js hoeft te installeren. U hoeft niets te weten over de container om deze trainingsmodule te voltooien.

Test uw kennis

1.

Welke van de volgende bewerkingen kunt u uitvoeren met de fs-module?