Node.js fs-Modul
Das fs-Modul (File System) ist ein integriertes Kernmodul in Node.js, das für die Interaktion mit dem Dateisystem verwendet wird.
Das fs-Modul bietet eine Reihe von Methoden zur Handhabung von Dateioperationen wie Lesen, Schreiben und Löschen.
Das fs-Modul ist eines der am häufigsten verwendeten Module in der Node.js-Entwicklung, insbesondere in Szenarien, in denen lokale Dateien verarbeitet werden müssen.
Wie verwendet man das fs-Modul?
Um das fs-Modul zu verwenden, muss man es zuerst importieren:
const fs = require('fs');
Ab Node.js 14 kann man auch die ES6-Import-Syntax verwenden:
Beispiel
const fs = require('fs'); // CommonJS-Methode
// oder
import fs from 'fs'; // ES-Modul-Methode
// oder
import fs from 'fs'; // ES-Modul-Methode
Hauptmethoden des fs-Moduls
1. Datei lesen
Datei synchron lesen (readFileSync)
Beispiel
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
console.log(data);
'example.txt': der Pfad der zu lesenden Datei'utf8': das Kodierungsformat angeben (optional)- Synchrone Methoden blockieren die Codeausführung, bis das Lesen der Datei abgeschlossen ist
Datei asynchron lesen (readFile)
Beispiel
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
if (err) throw err;
console.log(data);
});
- Asynchrone Methoden blockieren die Codeausführung nicht
- Ergebnisse über Callback-Funktionen verarbeiten
- Error-First-Callback ist ein gängiges Muster in Node.js
2. Dateischreiben
Datei synchron schreiben (writeFileSync)
Beispiel
fs.writeFileSync('output.txt', 'Hello, Node.js!');
Datei asynchron schreiben (writeFile)
Beispiel
fs.writeFile('output.txt', 'Hallo, Node.js!', (err) => {
if (err) throw err;
console.log('Datei gespeichert');
});
if (err) throw err;
console.log('Datei gespeichert');
});
3. Anhängen an Dateien
Synchron anhängen (appendFileSync)
Beispiel
fs.appendFileSync('log.txt', 'Neuer Protokollinhalt\n');
Asynchron anhängen (appendFile)
Beispiel
fs.appendFile('log.txt', 'Neuer Protokollinhalt\n', (err) => {
if (err) throw err;
});
if (err) throw err;
});
4. Dateistatusprüfung (stat)
Beispiel
fs.stat('example.txt', (err, stats) => {
if (err) throw err;
console.log(`Dateigröße: ${stats.size} bytes`);
console.log(`Erstellungszeit: ${stats.birthtime}`);
console.log(`Ob es eine Datei ist: ${stats.isFile()}`);
console.log(`Ob es ein Verzeichnis ist: ${stats.isDirectory()}`);
});
if (err) throw err;
console.log(`Dateigröße: ${stats.size} bytes`);
console.log(`Erstellungszeit: ${stats.birthtime}`);
console.log(`Ob es eine Datei ist: ${stats.isFile()}`);
console.log(`Ob es ein Verzeichnis ist: ${stats.isDirectory()}`);
});
5. Dateilöschung
Synchron löschen (unlinkSync)
Beispiel
fs.unlinkSync('fileToDelete.txt');
Asynchron löschen (unlink)
Beispiel
fs.unlink('fileToDelete.txt', (err) => {
if (err) throw err;
console.log('File deleted');
});
if (err) throw err;
console.log('File deleted');
});
Promise- und async/await-Unterstützung
Node.js 10+ bietet das Modul fs/promises, das Promise-basierte APIs unterstützt:
Beispiel
const fs = require('fs').promises;
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Fehler beim Lesen der Datei:', err);
}
}
readFile();
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8');
console.log(data);
} catch (err) {
console.error('Fehler beim Lesen der Datei:', err);
}
}
readFile();
Stream-basierte Dateioperationen
Bei großen Dateien kann die Verwendung von Streams die Leistung verbessern:
Lesestream
Beispiel
const readStream = fs.createReadStream('largeFile.txt', 'utf8');
readStream.on('data', (chunk) => {
console.log('Daten empfangen:', chunk.length);
});
readStream.on('end', () => {
console.log('Lesen abgeschlossen');
});
readStream.on('error', (err) => {
console.error('Lesefehler:', err);
});
readStream.on('data', (chunk) => {
console.log('Daten empfangen:', chunk.length);
});
readStream.on('end', () => {
console.log('Lesen abgeschlossen');
});
readStream.on('error', (err) => {
console.error('Lesefehler:', err);
});
Schreibstream
Beispiel
const writeStream = fs.createWriteStream('output.txt');
writeStream.write('Erste Zeile der Daten\n');
writeStream.write('Zweite Zeile der Daten\n');
writeStream.end('Letzte Zeile der Daten');
writeStream.on('finish', () => {
console.log('Schreiben abgeschlossen');
});
writeStream.on('error', (err) => {
console.error('Schreibfehler:', err);
});
writeStream.write('Erste Zeile der Daten\n');
writeStream.write('Zweite Zeile der Daten\n');
writeStream.end('Letzte Zeile der Daten');
writeStream.on('finish', () => {
console.log('Schreiben abgeschlossen');
});
writeStream.on('error', (err) => {
console.error('Schreibfehler:', err);
});
Verzeichnisoperationen
Verzeichnis erstellen
Beispiel
fs.mkdir('newFolder', (err) => {
if (err) throw err;
console.log('Verzeichnis erstellt');
});
if (err) throw err;
console.log('Verzeichnis erstellt');
});
Verzeichnisinhalte lesen
Beispiel
fs.readdir('./', (err, files) => {
if (err) throw err;
console.log('Aktuelle Verzeichnisinhalte:', files);
});
if (err) throw err;
console.log('Aktuelle Verzeichnisinhalte:', files);
});
Verzeichnis löschen
Beispiel
fs.rmdir('emptyFolder', (err) => {
if (err) throw err;
console.log('Verzeichnis gelöscht');
});
if (err) throw err;
console.log('Verzeichnis gelöscht');
});
Best Practices
- Bevorzugen Sie asynchrone Methoden: Vermeiden Sie das Blockieren der Ereignisschleife
- Fehlerbehandlung: mögliche Fehler immer behandeln
- Streams zum Verarbeiten großer Dateien verwenden: Leistung verbessern
- Pfadbehandlung: das path-Modul verwenden, um plattformübergreifende Pfadprobleme zu behandeln
- Berechtigungsprüfung: Datei-/Verzeichnisberechtigungen vor Operationen prüfen
Praktische Anwendungsbeispiele
Dateikopierfunktion
Beispiel
const fs = require('fs');
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('Kopieren fehlgeschlagen:', err);
console.log('Datei erfolgreich kopiert');
});
function copyFile(source, target, cb) {
const readStream = fs.createReadStream(source);
const writeStream = fs.createWriteStream(target);
readStream.on('error', cb);
writeStream.on('error', cb);
readStream.on('close', () => {
writeStream.end();
cb(null);
});
readStream.pipe(writeStream);
}
copyFile('source.txt', 'target.txt', (err) => {
if (err) return console.error('Kopieren fehlgeschlagen:', err);
console.log('Datei erfolgreich kopiert');
});
Andere Erweiterungen
Integrierte Module in Node.js