Met het bestandssysteem werken
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.