Einleitung: Warum die Arbeit mit dem Dateisystem in Node.js wichtig ist
In der modernen Webentwicklung kommt man selten ohne Interaktion mit dem Dateisystem aus. Ob es das Hochladen von Benutzeravataren, das Generieren von Logs, die Verarbeitung von CSV-Berichten oder das Lesen von Konfigurationsdateien ist – Node.js bietet das leistungsstarke integrierte Modul fs (File System) für diese Aufgaben.
Im Gegensatz zu browserbasiertem JavaScript, wo der Zugriff auf Dateien aus Sicherheitsgründen stark eingeschränkt ist, gibt Node.js die volle Kontrolle über das Dateisystem des Servers. In diesem Artikel werden wir die wichtigsten Operationen anhand praktischer Beispiele durchgehen, die Ihnen helfen, sicher mit Dateien und Ordnern zu arbeiten.
Was Sie lernen werden:
- Wie man Dateien liest und schreibt (synchron und asynchron)
- Wie man mit Streams für große Dateien arbeitet
- Wie man Ordner erstellt, umbenennt und löscht
- Wie man Fehler und Pfade richtig behandelt
1. Grundlagen: Lesen und Schreiben von Dateien
Das Modul fs bietet drei Hauptansätze für die Arbeit mit Dateien: synchron, asynchron (mit Callbacks) und auf Promises basierend. Es wird empfohlen, den asynchronen Ansatz mit Promises (fs.promises) zu verwenden – er blockiert die Event Loop nicht und ist lesbarer.
1.1 Datei lesen
Der einfachste Weg, eine Datei vollständig zu lesen, ist die Verwendung von readFile.
const fs = require('fs').promises;
async function readConfig() { try { const data = await fs.readFile('./config.json', 'utf-8'); const config = JSON.parse(data); console.log('Port:', config.port); } catch (err) { console.error('Lesefehler:', err.message); }}
readConfig();Wichtig: Geben Sie die Kodierung an ('utf-8'), sonst wird ein Buffer-Objekt zurückgegeben.
1.2 In Datei schreiben
Verwenden Sie zum Schreiben writeFile (überschreibt die Datei) oder appendFile (hängt an das Ende an).
const fs = require('fs').promises;
async function saveLog(message) { const logLine = `[${new Date().toISOString()}] ${message}`; try { await fs.appendFile('./app.log', logLine); console.log('Log gespeichert'); } catch (err) { console.error('Schreibfehler:', err); }}
saveLog('Server gestartet');2. Arbeiten mit großen Dateien: Streams
Stellen Sie sich vor, Sie müssen eine Datei mit einer Größe von 2 GB lesen. Die Methode readFile würde sie vollständig in den Arbeitsspeicher laden, was zu einem Speicherleck führen kann. Für solche Fälle gibt es Streams (fs.createReadStream und fs.createWriteStream).
Ein Stream verarbeitet Daten in Teilen (Chunks), ohne die gesamte Datei im Speicher zu halten.
Beispiel: Kopieren einer großen Datei
const fs = require('fs');const path = require('path');
const source = path.join(__dirname, 'bigfile.zip');const destination = path.join(__dirname, 'copy.zip');
const readStream = fs.createReadStream(source);const writeStream = fs.createWriteStream(destination);
readStream.on('data', (chunk) => { console.log(`${chunk.length} Bytes gelesen`); writeStream.write(chunk);});
readStream.on('end', () => { writeStream.end(); console.log('Kopieren abgeschlossen');});
readStream.on('error', (err) => { console.error('Lesefehler:', err);});Tipp: Zum Kopieren ist es praktischer, die integrierte Methode pipeline aus dem Modul stream zu verwenden – sie behandelt Fehler automatisch und schließt die Streams.
3. Verzeichnisverwaltung
Die Arbeit mit Ordnern ist ein ebenso wichtiger Teil. Node.js ermöglicht das Erstellen, Lesen und Löschen von Verzeichnissen.
3.1 Ordner erstellen und prüfen
const fs = require('fs').promises;
async function ensureDir(dirPath) { try { await fs.mkdir(dirPath, { recursive: true }