Dateisystem#

Das node:fs-Modul ermöglicht die Interaktion mit dem Dateisystem, orientiert an standardmäßigen POSIX-Funktionen.

Zur Verwendung der Promise-basierten APIs

import * as fs from 'node:fs/promises';
const fs = require('node:fs/promises');

Zur Verwendung der Callback- und Sync-APIs

import * as fs from 'node:fs';
const fs = require('node:fs');

Alle Dateisystemoperationen haben synchrone, Callback- und Promise-basierte Formen und sind sowohl mit CommonJS-Syntax als auch mit ES6-Modulen (ESM) zugänglich.

Promise-Beispiel#

Promise-basierte Operationen geben ein Promise zurück, das erfüllt wird, wenn die asynchrone Operation abgeschlossen ist.

import { unlink } from 'node:fs/promises';

try {
  await unlink('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (error) {
  console.error('there was an error:', error.message);
}
const { unlink } = require('node:fs/promises');

(async function(path) {
  try {
    await unlink(path);
    console.log(`successfully deleted ${path}`);
  } catch (error) {
    console.error('there was an error:', error.message);
  }
})('/tmp/hello');

Callback-Beispiel#

Die Callback-Form nimmt als letztes Argument eine Abschluss-Callback-Funktion entgegen und führt die Operation asynchron aus. Die an den Abschluss-Callback übergebenen Argumente hängen von der Methode ab, aber das erste Argument ist immer für eine Ausnahme reserviert. Wenn die Operation erfolgreich abgeschlossen wurde, ist das erste Argument null oder undefined.

import { unlink } from 'node:fs';

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});
const { unlink } = require('node:fs');

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});

Die Callback-basierten Versionen der node:fs-Modul-APIs sind den Promise-APIs vorzuziehen, wenn maximale Leistung (sowohl in Bezug auf Ausführungszeit als auch Speicherzuweisung) erforderlich ist.

Synchrones Beispiel#

Die synchronen APIs blockieren den Node.js-Event-Loop und die weitere JavaScript-Ausführung, bis die Operation abgeschlossen ist. Ausnahmen werden sofort geworfen und können mit try…catch behandelt oder nach oben weitergereicht werden.

import { unlinkSync } from 'node:fs';

try {
  unlinkSync('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (err) {
  // handle the error
}
const { unlinkSync } = require('node:fs');

try {
  unlinkSync('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (err) {
  // handle the error
}

Promises-API#

Die fs/promises-API stellt asynchrone Dateisystemmethoden bereit, die Promises zurückgeben.

Die Promise-APIs verwenden den zugrunde liegenden Node.js-Threadpool, um Dateisystemoperationen außerhalb des Event-Loop-Threads auszuführen. Diese Operationen sind nicht synchronisiert oder threadsicher. Vorsicht ist geboten, wenn mehrere gleichzeitige Änderungen an derselben Datei vorgenommen werden, da es sonst zu Datenbeschädigungen kommen kann.

Klasse: FileHandle#

Ein <FileHandle>-Objekt ist ein Objekt-Wrapper für einen numerischen Dateideskriptor.

Instanzen des <FileHandle>-Objekts werden durch die Methode fsPromises.open() erstellt.

Alle <FileHandle>-Objekte sind <EventEmitter>.

Wenn ein <FileHandle> nicht mit der Methode filehandle.close() geschlossen wird, versucht es, den Dateideskriptor automatisch zu schließen und eine Prozesswarnung auszugeben, um Speicherlecks zu verhindern. Bitte verlassen Sie sich nicht auf dieses Verhalten, da es unzuverlässig sein kann und die Datei möglicherweise nicht geschlossen wird. Schließen Sie <FileHandle>-Instanzen stattdessen immer explizit. Node.js kann dieses Verhalten in Zukunft ändern.

Ereignis: 'close'#

Das 'close'-Ereignis wird ausgelöst, wenn der <FileHandle> geschlossen wurde und nicht mehr verwendet werden kann.

filehandle.appendFile(data[, options])#

Alias von filehandle.writeFile().

Bei der Arbeit mit Dateihandles kann der Modus nicht von dem Wert geändert werden, der mit fsPromises.open() festgelegt wurde. Daher entspricht dies filehandle.writeFile().

filehandle.chmod(mode)#
  • mode <integer> die Bitmaske für den Dateimodus.
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Ändert die Berechtigungen für die Datei. Siehe chmod(2).

filehandle.chown(uid, gid)#
  • uid <integer> Die Benutzer-ID des neuen Dateibesitzers.
  • gid <integer> die Gruppen-ID der neuen Dateigruppe.
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Ändert den Besitz der Datei. Ein Wrapper für chown(2).

filehandle.close()#
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Schließt das Dateihandle, nachdem auf den Abschluss aller ausstehenden Vorgänge für das Handle gewartet wurde.

import { open } from 'node:fs/promises';

let filehandle;
try {
  filehandle = await open('thefile.txt', 'r');
} finally {
  await filehandle?.close();
}
filehandle.createReadStream([options])#

options kann start- und end-Werte enthalten, um einen Bereich von Bytes aus der Datei anstelle der gesamten Datei zu lesen. Sowohl start als auch end sind inklusiv und beginnen bei 0 zu zählen; zulässige Werte liegen im Bereich [0, Number.MAX_SAFE_INTEGER]. Wenn start weggelassen oder undefined ist, liest filehandle.createReadStream() sequenziell ab der aktuellen Dateiposition. Die encoding kann jeder der von <Buffer> akzeptierten Werte sein.

Wenn der FileHandle auf ein zeichenorientiertes Gerät verweist, das nur blockierende Lesevorgänge unterstützt (wie eine Tastatur oder Soundkarte), werden Lesevorgänge erst abgeschlossen, wenn Daten verfügbar sind. Dies kann verhindern, dass der Prozess beendet wird und der Stream sich auf natürliche Weise schließt.

Standardmäßig sendet der Stream ein 'close'-Ereignis, nachdem er zerstört wurde. Setzen Sie die emitClose-Option auf false, um dieses Verhalten zu ändern.

import { open } from 'node:fs/promises';

const fd = await open('/dev/input/event0');
// Create a stream from some character device.
const stream = fd.createReadStream();
setTimeout(() => {
  stream.close(); // This may not close the stream.
  // Artificially marking end-of-stream, as if the underlying resource had
  // indicated end-of-file by itself, allows the stream to close.
  // This does not cancel pending read operations, and if there is such an
  // operation, the process may still not be able to exit successfully
  // until it finishes.
  stream.push(null);
  stream.read(0);
}, 100);

Wenn autoClose auf false gesetzt ist, wird der Dateideskriptor auch bei einem Fehler nicht geschlossen. Es liegt in der Verantwortung der Anwendung, ihn zu schließen und sicherzustellen, dass kein Dateideskriptor verloren geht (Leck). Wenn autoClose auf true gesetzt ist (Standardverhalten), wird der Dateideskriptor bei 'error' oder 'end' automatisch geschlossen.

Ein Beispiel zum Lesen der letzten 10 Bytes einer 100 Bytes langen Datei

import { open } from 'node:fs/promises';

const fd = await open('sample.txt');
fd.createReadStream({ start: 90, end: 99 });
filehandle.createWriteStream([options])#

options kann auch eine start-Option enthalten, um das Schreiben von Daten an einer Position nach dem Dateianfang zu ermöglichen; zulässige Werte liegen im Bereich [0, Number.MAX_SAFE_INTEGER]. Das Ändern einer Datei anstelle des Ersetzens erfordert möglicherweise, dass die flags-Option open auf r+ anstelle des Standardwerts r gesetzt wird. Die encoding kann jeder der von <Buffer> akzeptierten Werte sein.

Wenn autoClose auf true gesetzt ist (Standardverhalten), wird der Dateideskriptor bei 'error' oder 'finish' automatisch geschlossen. Wenn autoClose auf false gesetzt ist, wird der Dateideskriptor auch bei einem Fehler nicht geschlossen. Es liegt in der Verantwortung der Anwendung, ihn zu schließen und sicherzustellen, dass kein Dateideskriptor verloren geht.

Standardmäßig sendet der Stream ein 'close'-Ereignis, nachdem er zerstört wurde. Setzen Sie die emitClose-Option auf false, um dieses Verhalten zu ändern.

filehandle.datasync()#
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Erzwingt, dass alle derzeit in der Warteschlange befindlichen E/A-Operationen, die mit der Datei verknüpft sind, den synchronisierten E/A-Abschlusszustand des Betriebssystems erreichen. Einzelheiten finden Sie in der POSIX-Dokumentation für fdatasync(2).

Im Gegensatz zu filehandle.sync leert diese Methode keine geänderten Metadaten.

filehandle.fd#
filehandle.pull([...transforms][, options])#

Stabilität: 1 - Experimentell

  • ...transforms <Function> | <Object> Optionale Transformationen, die über stream/iter pull() angewendet werden.
  • options <Object>
    • signal <AbortSignal>
    • autoClose <boolean> Schließt das Dateihandle, wenn der Stream endet. Standard: false.
    • start <number> Byte-Offset für den Lesebeginn. Wenn angegeben, verwenden Lesevorgänge eine explizite Positionierung (pread-Semantik). Standard: aktuelle Dateiposition.
    • limit <number> Maximale Anzahl der zu lesenden Bytes vor Beendigung des Iterators. Lesevorgänge stoppen, wenn limit Bytes geliefert wurden oder EOF erreicht ist, je nachdem, was zuerst eintritt. Standard: lesen bis EOF.
    • chunkSize <number> Größe in Bytes des für jeden Lesevorgang zugewiesenen Buffers. Standard: 131072 (128 KB).
  • Gibt zurück: {AsyncIterable<Uint8Array[]>}

Gibt den Dateiinhalt als asynchrones Iterierbares unter Verwendung des node:stream/iter-Pull-Modells zurück. Lesevorgänge werden in chunkSize-Byte-Blöcken durchgeführt (Standard 128 KB). Wenn Transformationen bereitgestellt werden, werden diese über stream/iter pull() angewendet.

Das Dateihandle ist gesperrt, während das Iterierbare verbraucht wird, und wird entsperrt, wenn die Iteration abgeschlossen ist, ein Fehler auftritt oder der Consumer abbricht.

Diese Funktion ist nur verfügbar, wenn das Flag --experimental-stream-iter aktiviert ist.

import { open } from 'node:fs/promises';
import { text } from 'node:stream/iter';
import { compressGzip } from 'node:zlib/iter';

const fh = await open('input.txt', 'r');

// Read as text
console.log(await text(fh.pull({ autoClose: true })));

// Read 1 KB starting at byte 100
const fh2 = await open('input.txt', 'r');
console.log(await text(fh2.pull({ start: 100, limit: 1024, autoClose: true })));

// Read with compression
const fh3 = await open('input.txt', 'r');
const compressed = fh3.pull(compressGzip(), { autoClose: true });
const { open } = require('node:fs/promises');
const { text } = require('node:stream/iter');
const { compressGzip } = require('node:zlib/iter');

async function run() {
  const fh = await open('input.txt', 'r');

  // Read as text
  console.log(await text(fh.pull({ autoClose: true })));

  // Read 1 KB starting at byte 100
  const fh2 = await open('input.txt', 'r');
  console.log(await text(fh2.pull({ start: 100, limit: 1024, autoClose: true })));

  // Read with compression
  const fh3 = await open('input.txt', 'r');
  const compressed = fh3.pull(compressGzip(), { autoClose: true });
}

run().catch(console.error);
filehandle.pullSync([...transforms][, options])#

Stabilität: 1 - Experimentell

  • ...transforms <Function> | <Object> Optionale Transformationen, die über stream/iter pullSync() angewendet werden.
  • options <Object>
    • autoClose <boolean> Schließt das Dateihandle, wenn der Stream endet. Standard: false.
    • start <number> Byte-Offset für den Lesebeginn. Wenn angegeben, verwenden Lesevorgänge explizite Positionierung. Standard: aktuelle Dateiposition.
    • limit <number> Maximale Anzahl der zu lesenden Bytes vor Beendigung des Iterators. Standard: lesen bis EOF.
    • chunkSize <number> Größe in Bytes des für jeden Lesevorgang zugewiesenen Buffers. Standard: 131072 (128 KB).
  • Gibt zurück: {Iterable<Uint8Array[]>}

Synchrones Gegenstück zu filehandle.pull(). Gibt ein synchrones Iterierbares zurück, das die Datei unter Verwendung von synchroner E/A im Hauptthread liest. Lesevorgänge werden in chunkSize-Byte-Blöcken durchgeführt (Standard 128 KB).

Das Dateihandle ist gesperrt, während das Iterierbare verbraucht wird. Im Gegensatz zum asynchronen pull() unterstützt diese Methode kein AbortSignal, da alle Operationen synchron sind.

Diese Funktion ist nur verfügbar, wenn das Flag --experimental-stream-iter aktiviert ist.

import { open } from 'node:fs/promises';
import { textSync, pipeToSync } from 'node:stream/iter';
import { compressGzipSync, decompressGzipSync } from 'node:zlib/iter';

const fh = await open('input.txt', 'r');

// Read as text (sync)
console.log(textSync(fh.pullSync({ autoClose: true })));

// Sync compress pipeline: file -> gzip -> file
const src = await open('input.txt', 'r');
const dst = await open('output.gz', 'w');
pipeToSync(src.pullSync(compressGzipSync(), { autoClose: true }), dst.writer({ autoClose: true }));
const { open } = require('node:fs/promises');
const { textSync, pipeToSync } = require('node:stream/iter');
const { compressGzipSync, decompressGzipSync } = require('node:zlib/iter');

async function run() {
  const fh = await open('input.txt', 'r');

  // Read as text (sync)
  console.log(textSync(fh.pullSync({ autoClose: true })));

  // Sync compress pipeline: file -> gzip -> file
  const src = await open('input.txt', 'r');
  const dst = await open('output.gz', 'w');
  pipeToSync(
    src.pullSync(compressGzipSync(), { autoClose: true }),
    dst.writer({ autoClose: true }),
  );
}

run().catch(console.error);
filehandle.read(buffer, offset, length, position)#
  • buffer <Buffer> | <TypedArray> | <DataView> Ein Puffer, der mit den gelesenen Dateidaten gefüllt wird.
  • offset <integer> Die Position im Puffer, an der mit dem Füllen begonnen werden soll. Standard: 0
  • length <integer> Die Anzahl der zu lesenden Bytes. Standard: buffer.byteLength - offset
  • position <integer> | <bigint> | <null> Die Stelle, an der mit dem Lesen der Daten aus der Datei begonnen werden soll. Wenn null oder -1, werden die Daten ab der aktuellen Dateiposition gelesen und die Position wird aktualisiert. Wenn position eine nicht-negative Ganzzahl ist, bleibt die aktuelle Dateiposition unverändert. Standard: null
  • Rückgabe: <Promise> Erfüllt bei Erfolg ein Objekt mit zwei Eigenschaften

Liest Daten aus der Datei und speichert diese im angegebenen Puffer.

Wenn die Datei nicht gleichzeitig geändert wird, ist das Dateiende erreicht, wenn die Anzahl der gelesenen Bytes Null ist.

filehandle.read([options])#
  • options <Object>
    • buffer <Buffer> | <TypedArray> | <DataView> Ein Puffer, der mit den gelesenen Dateidaten gefüllt wird. Standard: Buffer.alloc(16384)
    • offset <integer> Die Position im Puffer, an der mit dem Füllen begonnen werden soll. Standard: 0
    • length <integer> Die Anzahl der zu lesenden Bytes. Standard: buffer.byteLength - offset
    • position <integer> | <bigint> | <null> Die Stelle, an der mit dem Lesen aus der Datei begonnen werden soll. Wenn null oder -1, werden die Daten ab der aktuellen Position gelesen und die Position wird aktualisiert. Wenn position eine nicht-negative Ganzzahl ist, bleibt die aktuelle Position unverändert. Standard: null
  • Rückgabe: <Promise> Erfüllt bei Erfolg ein Objekt mit zwei Eigenschaften

Liest Daten aus der Datei und speichert diese im angegebenen Puffer.

Wenn die Datei nicht gleichzeitig geändert wird, ist das Dateiende erreicht, wenn die Anzahl der gelesenen Bytes Null ist.

filehandle.read(buffer[, options])#
  • buffer <Buffer> | <TypedArray> | <DataView> Ein Puffer, der mit den gelesenen Dateidaten gefüllt wird.
  • options <Object>
    • offset <integer> Die Position im Puffer, an der mit dem Füllen begonnen werden soll. Standard: 0
    • length <integer> Die Anzahl der zu lesenden Bytes. Standard: buffer.byteLength - offset
    • position <integer> | <bigint> | <null> Die Stelle, an der mit dem Lesen aus der Datei begonnen werden soll. Wenn null oder -1, werden die Daten ab der aktuellen Position gelesen und die Position wird aktualisiert. Wenn position eine nicht-negative Ganzzahl ist, bleibt die aktuelle Position unverändert. Standard: null
  • Rückgabe: <Promise> Erfüllt bei Erfolg ein Objekt mit zwei Eigenschaften

Liest Daten aus der Datei und speichert diese im angegebenen Puffer.

Wenn die Datei nicht gleichzeitig geändert wird, ist das Dateiende erreicht, wenn die Anzahl der gelesenen Bytes Null ist.

filehandle.readableWebStream([options])#

Gibt einen byte-orientierten ReadableStream zurück, der zum Lesen des Dateiinhaltes verwendet werden kann.

Ein Fehler wird ausgelöst, wenn diese Methode mehr als einmal aufgerufen wird oder nachdem der FileHandle geschlossen wurde oder sich im Schließvorgang befindet.

import {
  open,
} from 'node:fs/promises';

const file = await open('./some/file/to/read');

for await (const chunk of file.readableWebStream())
  console.log(chunk);

await file.close();
const {
  open,
} = require('node:fs/promises');

(async () => {
  const file = await open('./some/file/to/read');

  for await (const chunk of file.readableWebStream())
    console.log(chunk);

  await file.close();
})();

Während der ReadableStream die Datei vollständig liest, schließt er den FileHandle nicht automatisch. Der Benutzercode muss weiterhin die fileHandle.close()-Methode aufrufen, es sei denn, die autoClose-Option ist auf true gesetzt.

filehandle.readFile(options)#
  • options <Object> | <string>
  • Rückgabe: <Promise> Erfüllt bei erfolgreichem Lesen mit dem Inhalt der Datei. Wenn keine Kodierung angegeben ist (unter Verwendung von options.encoding), werden die Daten als <Buffer>-Objekt zurückgegeben. Andernfalls sind die Daten ein String.

Liest den gesamten Inhalt einer Datei asynchron.

Wenn options ein String ist, dann spezifiziert er die encoding.

Der <FileHandle> muss das Lesen unterstützen.

Wenn ein oder mehrere filehandle.read()-Aufrufe auf einem Dateihandle getätigt werden und anschließend ein filehandle.readFile()-Aufruf erfolgt, werden die Daten ab der aktuellen Position bis zum Ende der Datei gelesen. Es wird nicht immer vom Anfang der Datei gelesen.

filehandle.readLines([options])#

Komfortmethode zum Erstellen eines readline-Interfaces und zum Streamen über die Datei. Siehe filehandle.createReadStream() für die Optionen.

import { open } from 'node:fs/promises';

const file = await open('./some/file/to/read');

for await (const line of file.readLines()) {
  console.log(line);
}
const { open } = require('node:fs/promises');

(async () => {
  const file = await open('./some/file/to/read');

  for await (const line of file.readLines()) {
    console.log(line);
  }
})();
filehandle.readv(buffers[, position])#

Liest aus einer Datei und schreibt in ein Array von <ArrayBufferView>-Instanzen

filehandle.stat([options])#
filehandle.sync()#
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Fordert an, dass alle Daten für den geöffneten Dateideskriptor auf das Speichergerät geleert werden. Die spezifische Implementierung ist betriebssystem- und geräteabhängig. Weitere Informationen finden Sie in der POSIX-Dokumentation für fsync(2).

filehandle.truncate(len)#
  • len <integer> Standard: 0
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Kürzt die Datei.

Wenn die Datei größer als len Bytes war, werden nur die ersten len Bytes in der Datei beibehalten.

Das folgende Beispiel behält nur die ersten vier Bytes der Datei bei

import { open } from 'node:fs/promises';

let filehandle = null;
try {
  filehandle = await open('temp.txt', 'r+');
  await filehandle.truncate(4);
} finally {
  await filehandle?.close();
}

Wenn die Datei zuvor kürzer als len Bytes war, wird sie erweitert, und der erweiterte Teil wird mit Null-Bytes ('\0') gefüllt

Wenn len negativ ist, wird 0 verwendet.

filehandle.utimes(atime, mtime)#

Ändert die Dateisystem-Zeitstempel des Objekts, auf das der <FileHandle> verweist, und erfüllt dann das Promise ohne Argumente bei Erfolg.

filehandle.write(buffer, offset[, length[, position]])#
  • buffer <Buffer> | <TypedArray> | <DataView>
  • offset <integer> Die Startposition innerhalb von buffer, an der die zu schreibenden Daten beginnen.
  • length <integer> Die Anzahl der Bytes aus buffer, die geschrieben werden sollen. Standard: buffer.byteLength - offset
  • position <integer> | <null> Der Offset vom Dateianfang, an dem die Daten aus buffer geschrieben werden sollen. Wenn position keine Zahl ist, werden die Daten an der aktuellen Position geschrieben. Weitere Details finden Sie in der POSIX-Dokumentation für pwrite(2). Standard: null
  • Rückgabewert: <Promise>

Schreibt buffer in die Datei.

Das Promise wird mit einem Objekt erfüllt, das zwei Eigenschaften enthält

Es ist unsicher, filehandle.write() mehrmals auf derselben Datei zu verwenden, ohne auf die Erfüllung (oder Ablehnung) des Promises zu warten. Verwenden Sie für dieses Szenario filehandle.createWriteStream().

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus (append mode) geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

filehandle.write(buffer[, options])#

Schreibt buffer in die Datei.

Ähnlich wie die obige filehandle.write-Funktion akzeptiert diese Version ein optionales options-Objekt. Wenn kein options-Objekt angegeben ist, werden die obigen Standardwerte verwendet.

filehandle.write(string[, position[, encoding]])#
  • string <string>
  • position <integer> | <null> Der Offset vom Dateianfang, an dem die Daten aus string geschrieben werden sollen. Wenn position keine Zahl ist, werden die Daten an der aktuellen Position geschrieben. Weitere Details finden Sie in der POSIX-Dokumentation für pwrite(2). Standard: null
  • encoding <string> Die erwartete String-Kodierung. Standard: 'utf8'
  • Rückgabewert: <Promise>

Schreibt string in die Datei. Wenn string kein String ist, wird das Promise mit einem Fehler abgelehnt.

Das Promise wird mit einem Objekt erfüllt, das zwei Eigenschaften enthält

  • bytesWritten <integer> die Anzahl der geschriebenen Bytes
  • buffer <string> eine Referenz auf den geschriebenen string.

Es ist unsicher, filehandle.write() mehrmals auf derselben Datei zu verwenden, ohne auf die Erfüllung (oder Ablehnung) des Promises zu warten. Verwenden Sie für dieses Szenario filehandle.createWriteStream().

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus (append mode) geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

filehandle.writeFile(data, options)#

Schreibt Daten asynchron in eine Datei und ersetzt die Datei, falls sie bereits existiert. data kann ein String, ein Puffer, ein <AsyncIterable> oder ein <Iterable>-Objekt sein. Das Promise wird bei Erfolg ohne Argumente erfüllt.

Wenn options ein String ist, dann spezifiziert er die encoding.

Der <FileHandle> muss das Schreiben unterstützen.

Es ist unsicher, filehandle.writeFile() mehrmals auf derselben Datei zu verwenden, ohne auf die Erfüllung (oder Ablehnung) des Promises zu warten.

Wenn ein oder mehrere filehandle.write()-Aufrufe auf einem Dateihandle getätigt werden und anschließend ein filehandle.writeFile()-Aufruf erfolgt, werden die Daten ab der aktuellen Position bis zum Ende der Datei geschrieben. Es wird nicht immer vom Anfang der Datei geschrieben.

filehandle.writev(buffers[, position])#

Schreibt ein Array von <ArrayBufferView>-Instanzen in die Datei.

Das Promise wird mit einem Objekt erfüllt, das zwei Eigenschaften enthält

Es ist unsicher, writev() mehrmals auf derselben Datei aufzurufen, ohne auf die Erfüllung (oder Ablehnung) des Promises zu warten.

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

filehandle.writer([options])#

Stabilität: 1 - Experimentell

  • options <Object>
    • autoClose <boolean> Schließt das Dateihandle, wenn der Writer endet oder fehlschlägt. Standard: false.
    • start <number> Byte-Offset für den Schreibbeginn. Wenn angegeben, verwenden Schreibvorgänge explizite Positionierung. Standard: aktuelle Dateiposition.
    • limit <number> Maximale Anzahl von Bytes, die der Writer akzeptiert. Asynchrone Schreibvorgänge (write(), writev()), die das Limit überschreiten würden, werden mit ERR_OUT_OF_RANGE abgelehnt. Synchrone Schreibvorgänge (writeSync(), writevSync()) geben false zurück. Standard: kein Limit.
    • chunkSize <number> Maximale Chunk-Größe in Bytes für synchrone Schreibvorgänge. Schreibvorgänge, die größer als dieser Schwellenwert sind, greifen auf asynchrone E/A zurück. Setzen Sie dies passend zur chunkSize des Readers für optimale pipeTo()-Leistung. Standard: 131072 (128 KB).
  • Rückgabewert: <Object>
    • write(chunk[, options]) <Function> Gibt {Promise zurück}. Akzeptiert Uint8Array, Buffer oder String (UTF-8 kodiert).
    • writev(chunks[, options]) <Function> Gibt {Promise zurück}. Verwendet Scatter/Gather-E/A über einen einzelnen writev()-Systemaufruf. Akzeptiert gemischte Uint8Array/String-Arrays.
      • chunks {Array<Buffer|TypedArray|DataView|string>}
      • options <Object>
        • signal <AbortSignal> Wenn das Signal bereits abgebrochen wurde, wird der Schreibvorgang mit AbortError abgelehnt, ohne E/A durchzuführen.
    • writeSync(chunk) <Function> Gibt <boolean> zurück. Versucht einen synchronen Schreibvorgang. Gibt true zurück, wenn das Schreiben erfolgreich war, false, wenn der Aufrufer auf asynchrones write() zurückgreifen sollte. Gibt false zurück, wenn: der Writer geschlossen ist/fehlerhaft ist, eine asynchrone Operation im Gange ist, der Chunk chunkSize überschreitet oder das Schreiben das limit überschreiten würde.
    • writevSync(chunks) <Function> Gibt <boolean> zurück. Synchroner Batch-Schreibvorgang. Gleiche Fallback-Semantik wie writeSync().
      • chunks {Array<Buffer|TypedArray|DataView|string>}
    • end([options]) <Function> Gibt {Promise zurück} Gesamtzahl der geschriebenen Bytes. Idempotent: gibt totalBytesWritten zurück, falls bereits geschlossen, gibt das ausstehende Promise zurück, falls bereits geschlossen wird. Lehnt ab, wenn sich der Writer in einem fehlerhaften Zustand befindet.
      • options <Object>
        • signal <AbortSignal> Wenn das Signal bereits abgebrochen wurde, wird end() mit AbortError abgelehnt und der Writer bleibt geöffnet.
    • endSync() <Function> Gibt <number> | <number> Gesamtzahl der geschriebenen Bytes bei Erfolg zurück, -1, wenn der Writer fehlerhaft ist oder eine asynchrone Operation im Gange ist. Idempotent, wenn bereits geschlossen.
    • fail(reason) <Function> Versetzt den Writer in einen terminalen Fehlerzustand. Synchron. Wenn der Writer bereits geschlossen oder fehlerhaft ist, ist dies ein No-Op. Wenn autoClose wahr ist, schließt es das Dateihandle synchron.

Gibt einen node:stream/iter-Writer zurück, der von diesem Dateihandle unterstützt wird.

Der Writer unterstützt sowohl Symbol.asyncDispose als auch Symbol.dispose

  • await using w = fh.writer() — wenn der Writer noch geöffnet ist (kein end() aufgerufen), ruft asyncDispose fail() auf. Wenn end() aussteht, wartet es auf den Abschluss.
  • using w = fh.writer() — ruft fail() bedingungslos auf.

Die writeSync()- und writevSync()-Methoden ermöglichen den try-sync-Fast-Path, der von stream/iter pipeTo() verwendet wird. Wenn die Chunk-Größe des Readers mit der chunkSize des Writers übereinstimmt, werden alle Schreibvorgänge in einer pipeTo()-Pipeline synchron ohne Promise-Overhead abgeschlossen.

Diese Funktion ist nur verfügbar, wenn das Flag --experimental-stream-iter aktiviert ist.

import { open } from 'node:fs/promises';
import { from, pipeTo } from 'node:stream/iter';
import { compressGzip } from 'node:zlib/iter';

// Async pipeline
const fh = await open('output.gz', 'w');
await pipeTo(from('Hello!'), compressGzip(), fh.writer({ autoClose: true }));

// Sync pipeline with limit
const src = await open('input.txt', 'r');
const dst = await open('output.txt', 'w');
const w = dst.writer({ limit: 1024 * 1024 }); // Max 1 MB
await pipeTo(src.pull({ autoClose: true }), w);
await w.end();
await dst.close();
const { open } = require('node:fs/promises');
const { from, pipeTo } = require('node:stream/iter');
const { compressGzip } = require('node:zlib/iter');

async function run() {
  // Async pipeline
  const fh = await open('output.gz', 'w');
  await pipeTo(from('Hello!'), compressGzip(), fh.writer({ autoClose: true }));

  // Sync pipeline with limit
  const src = await open('input.txt', 'r');
  const dst = await open('output.txt', 'w');
  const w = dst.writer({ limit: 1024 * 1024 }); // Max 1 MB
  await pipeTo(src.pull({ autoClose: true }), w);
  await w.end();
  await dst.close();
}

run().catch(console.error);
filehandle[Symbol.asyncDispose]()#

Ruft filehandle.close() auf und gibt ein Promise zurück, das erfüllt wird, wenn das Dateihandle geschlossen ist.

fsPromises.access(path[, mode])#

Testet die Berechtigungen eines Benutzers für die durch path angegebene Datei oder das Verzeichnis. Das mode-Argument ist eine optionale Ganzzahl, die die durchzuführenden Zugriffsprüfungen angibt. mode sollte entweder der Wert fs.constants.F_OK sein oder eine Maske, die aus der bitweisen ODER-Verknüpfung von fs.constants.R_OK, fs.constants.W_OK und fs.constants.X_OK besteht (z. B. fs.constants.W_OK | fs.constants.R_OK). Prüfen Sie Dateizugriffskonstanten für mögliche mode-Werte.

Wenn die Zugriffsprüfung erfolgreich ist, wird das Promise ohne Wert erfüllt. Wenn eine der Zugriffsprüfungen fehlschlägt, wird das Promise mit einem <Error>-Objekt abgelehnt. Das folgende Beispiel prüft, ob die Datei /etc/passwd vom aktuellen Prozess gelesen und geschrieben werden kann.

import { access, constants } from 'node:fs/promises';

try {
  await access('/etc/passwd', constants.R_OK | constants.W_OK);
  console.log('can access');
} catch {
  console.error('cannot access');
}

Die Verwendung von fsPromises.access() zur Prüfung der Erreichbarkeit einer Datei vor dem Aufruf von fsPromises.open() wird nicht empfohlen. Dies führt zu einer Race-Condition, da andere Prozesse den Dateizustand zwischen den beiden Aufrufen ändern könnten. Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler behandeln, falls die Datei nicht zugänglich ist.

fsPromises.appendFile(path, data[, options])#

Hängt Daten asynchron an eine Datei an und erstellt die Datei, falls sie noch nicht existiert. data kann ein String oder ein <Buffer> sein.

Wenn options ein String ist, dann spezifiziert er die encoding.

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

Der path kann als <FileHandle> angegeben werden, der zum Anfügen geöffnet wurde (unter Verwendung von fsPromises.open()).

fsPromises.chmod(path, mode)#

Ändert die Berechtigungen einer Datei.

fsPromises.chown(path, uid, gid)#

Ändert den Besitz einer Datei.

fsPromises.copyFile(src, dest[, mode])#

  • src <string> | <Buffer> | <URL> Quell-Dateiname zum Kopieren
  • dest <string> | <Buffer> | <URL> Ziel-Dateiname der Kopieroperation
  • mode <integer> Optionale Modifikatoren, die das Verhalten der Kopieroperation festlegen. Es ist möglich, eine Maske zu erstellen, die aus der bitweisen ODER-Verknüpfung von zwei oder mehr Werten besteht (z. B. fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE) Standard: 0.
    • fs.constants.COPYFILE_EXCL: Die Kopieroperation schlägt fehl, wenn dest bereits existiert.
    • fs.constants.COPYFILE_FICLONE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, wird ein Fallback-Kopiermechanismus verwendet.
    • fs.constants.COPYFILE_FICLONE_FORCE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, schlägt die Operation fehl.
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Kopiert src asynchron nach dest. Standardmäßig wird dest überschrieben, wenn es bereits existiert.

Es gibt keine Garantien für die Atomarität der Kopieroperation. Wenn nach dem Öffnen der Zieldatei zum Schreiben ein Fehler auftritt, wird versucht, das Ziel zu entfernen.

import { copyFile, constants } from 'node:fs/promises';

try {
  await copyFile('source.txt', 'destination.txt');
  console.log('source.txt was copied to destination.txt');
} catch {
  console.error('The file could not be copied');
}

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
try {
  await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
  console.log('source.txt was copied to destination.txt');
} catch {
  console.error('The file could not be copied');
}

fsPromises.cp(src, dest[, options])#

  • src <string> | <URL> Quellpfad zum Kopieren.
  • dest <string> | <URL> Zielpfad zum Kopieren.
  • options <Object>
    • dereference <boolean> Dereferenzierung von symbolischen Links. Standard: false.
    • errorOnExist <boolean> wenn force false ist und das Ziel existiert, einen Fehler werfen. Standard: false.
    • filter <Function> Funktion zum Filtern kopierter Dateien/Verzeichnisse. Geben Sie true zurück, um das Element zu kopieren, false, um es zu ignorieren. Beim Ignorieren eines Verzeichnisses wird auch dessen gesamter Inhalt übersprungen. Kann auch ein Promise zurückgeben, das zu true oder false aufgelöst wird. Standard: undefined.
      • src <string> Quellpfad zum Kopieren.
      • dest <string> Zielpfad zum Kopieren.
      • Rückgabe: <boolean> | <Promise> Ein Wert, der in boolean konvertierbar ist, oder ein Promise, das zu einem solchen Wert aufgelöst wird.
    • force <boolean> Bestehende Datei oder bestehendes Verzeichnis überschreiben. Die Kopieroperation ignoriert Fehler, wenn Sie dies auf false setzen und das Ziel existiert. Verwenden Sie die errorOnExist-Option, um dieses Verhalten zu ändern. Standard: true.
    • mode <integer> Modifikatoren für die Kopieroperation. Standard: 0. Siehe mode-Flag von fsPromises.copyFile().
    • preserveTimestamps <boolean> Wenn true, werden Zeitstempel von src beibehalten. Standard: false.
    • recursive <boolean> Verzeichnisse rekursiv kopieren Standard: false
    • verbatimSymlinks <boolean> Wenn true, wird die Pfadauflösung für symbolische Links übersprungen. Standard: false
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Kopiert die gesamte Verzeichnisstruktur asynchron von src nach dest, einschließlich Unterverzeichnisse und Dateien.

Beim Kopieren eines Verzeichnisses in ein anderes Verzeichnis werden keine Globs unterstützt und das Verhalten entspricht cp dir1/ dir2/.

fsPromises.glob(pattern[, options])#

  • pattern <string> | <string[]>
  • options <Object>
    • cwd <string> | <URL> Aktuelles Arbeitsverzeichnis. Standard: process.cwd()
    • exclude <Function> | <string[]> Funktion zum Ausschließen von Dateien/Verzeichnissen oder eine Liste von Glob-Mustern, die ausgeschlossen werden sollen. Wenn eine Funktion bereitgestellt wird, geben Sie true zurück, um das Element auszuschließen, false, um es einzuschließen. Standard: undefined. Wenn ein String-Array bereitgestellt wird, sollte jeder String ein Glob-Muster sein, das die auszuschließenden Pfade angibt. Hinweis: Verneinungsmuster (z. B. '!foo.js') werden nicht unterstützt.
    • withFileTypes <boolean> true, wenn die Glob-Funktion Pfade als Dirents zurückgeben soll, sonst false. Standard: false.
  • Rückgabe: <AsyncIterator> Ein AsyncIterator, der die Pfade von Dateien liefert, die dem Muster entsprechen.
import { glob } from 'node:fs/promises';

for await (const entry of glob('**/*.js'))
  console.log(entry);
const { glob } = require('node:fs/promises');

(async () => {
  for await (const entry of glob('**/*.js'))
    console.log(entry);
})();

fsPromises.lchmod(path, mode)#

Stabilität: 0 - Veraltet

Ändert die Berechtigungen für einen symbolischen Link.

Diese Methode ist nur unter macOS implementiert.

fsPromises.lchown(path, uid, gid)#

Ändert den Besitz eines symbolischen Links.

fsPromises.lutimes(path, atime, mtime)#

Ändert die Zugriffs- und Änderungszeiten einer Datei auf dieselbe Weise wie fsPromises.utimes(), mit dem Unterschied, dass, wenn der Pfad auf einen symbolischen Link verweist, der Link nicht dereferenziert wird: Stattdessen werden die Zeitstempel des symbolischen Links selbst geändert.

fsPromises.link(existingPath, newPath)#

Erstellt eine neue Verknüpfung von existingPath zu newPath. Weitere Details finden Sie in der POSIX-Dokumentation für link(2).

fsPromises.lstat(path[, options])#

Entspricht fsPromises.stat(), es sei denn, path verweist auf einen symbolischen Link. In diesem Fall wird der Status des Links selbst abgefragt, nicht der der Datei, auf die er verweist. Weitere Details finden Sie im POSIX-Dokument für lstat(2).

fsPromises.mkdir(path[, options])#

Erstellt ein Verzeichnis asynchron.

Das optionale options-Argument kann eine Ganzzahl sein, die den mode (Berechtigungs- und Sticky-Bits) angibt, oder ein Objekt mit einer mode-Eigenschaft und einer recursive-Eigenschaft, die angibt, ob übergeordnete Verzeichnisse erstellt werden sollen. Der Aufruf von fsPromises.mkdir(), wenn path ein existierendes Verzeichnis ist, führt nur dann zu einer Ablehnung, wenn recursive false ist.

import { mkdir } from 'node:fs/promises';

try {
  const projectFolder = new URL('./test/project/', import.meta.url);
  const createDir = await mkdir(projectFolder, { recursive: true });

  console.log(`created ${createDir}`);
} catch (err) {
  console.error(err.message);
}
const { mkdir } = require('node:fs/promises');
const { join } = require('node:path');

async function makeDirectory() {
  const projectFolder = join(__dirname, 'test', 'project');
  const dirCreation = await mkdir(projectFolder, { recursive: true });

  console.log(dirCreation);
  return dirCreation;
}

makeDirectory().catch(console.error);

fsPromises.mkdtemp(prefix[, options])#

Erstellt ein eindeutiges temporäres Verzeichnis. Ein eindeutiger Verzeichnisname wird durch Anhängen von sechs Zufallszeichen an das Ende des bereitgestellten prefix generiert. Aufgrund von Plattforminkonsistenzen sollten Sie nachgestellte X-Zeichen im prefix vermeiden. Einige Plattformen, insbesondere die BSDs, können mehr als sechs Zufallszeichen zurückgeben und ersetzen nachgestellte X-Zeichen im prefix durch Zufallszeichen.

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die zu verwendende Zeichenkodierung festlegt.

import { mkdtemp } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

try {
  await mkdtemp(join(tmpdir(), 'foo-'));
} catch (err) {
  console.error(err);
}

Die fsPromises.mkdtemp()-Methode hängt die sechs zufällig ausgewählten Zeichen direkt an den prefix-String an. Wenn beispielsweise ein Verzeichnis /tmp gegeben ist und die Absicht besteht, ein temporäres Verzeichnis innerhalb von /tmp zu erstellen, muss das prefix mit einem nachgestellten plattformspezifischen Pfadtrenner enden (require('node:path').sep).

fsPromises.mkdtempDisposable(prefix[, options])#

Das resultierende Promise enthält ein async-disposable Objekt, dessen path-Eigenschaft den erstellten Verzeichnispfad enthält. Wenn das Objekt bereinigt (disposed) wird, werden das Verzeichnis und dessen Inhalt asynchron entfernt, falls es noch existiert. Wenn das Verzeichnis nicht gelöscht werden kann, wirft der Bereinigungsvorgang einen Fehler. Das Objekt verfügt über eine asynchrone remove()-Methode, die dieselbe Aufgabe erfüllt.

Sowohl diese Funktion als auch die Bereinigungsfunktion auf dem resultierenden Objekt sind asynchron, daher sollte sie mit await + await using verwendet werden, wie z. B. await using dir = await fsPromises.mkdtempDisposable('prefix').

Detaillierte Informationen finden Sie in der Dokumentation zu fsPromises.mkdtemp().

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die zu verwendende Zeichenkodierung festlegt.

fsPromises.open(path, flags[, mode])#

Öffnet einen <FileHandle>.

Weitere Details finden Sie in der POSIX-Dokumentation für open(2).

Einige Zeichen (< > : " / \ | ? *) sind unter Windows reserviert, wie in Benennung von Dateien, Pfaden und Namespaces dokumentiert. Wenn unter NTFS der Dateiname einen Doppelpunkt enthält, öffnet Node.js einen Dateisystem-Stream, wie auf dieser MSDN-Seite beschrieben.

fsPromises.opendir(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • encoding <string> | <null> Standard: 'utf8'
    • bufferSize <number> Anzahl der Verzeichniseinträge, die beim Lesen aus dem Verzeichnis intern gepuffert werden. Höhere Werte führen zu besserer Leistung, aber höherem Speicherverbrauch. Standard: 32
    • recursive <boolean> Das aufgelöste Dir ist ein <AsyncIterable>, das alle Unterdateien und -verzeichnisse enthält. Standard: false
  • Rückgabe: <Promise> Erfüllt mit einem <fs.Dir>-Objekt.

Öffnet ein Verzeichnis asynchron für das iterative Scannen. Weitere Details finden Sie in der POSIX-Dokumentation für opendir(3).

Erstellt ein <fs.Dir>-Objekt, das alle weiteren Funktionen zum Lesen und Bereinigen des Verzeichnisses enthält.

Die encoding-Option legt die Kodierung für den path beim Öffnen des Verzeichnisses und für nachfolgende Lesevorgänge fest.

Beispiel mit asynchroner Iteration

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
}

Bei Verwendung des asynchronen Iterators wird das <fs.Dir>-Objekt nach dem Beenden des Iterators automatisch geschlossen.

fsPromises.readdir(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <string> | <Object>
    • encoding <string> Standard: 'utf8'
    • withFileTypes <boolean> Standard: false
    • recursive <boolean> Wenn true, wird der Inhalt eines Verzeichnisses rekursiv gelesen. Im rekursiven Modus werden alle Dateien, Unterdateien und Verzeichnisse aufgelistet. Standard: false.
  • Rückgabe: <Promise> Erfüllt mit einem Array der Namen der Dateien im Verzeichnis, ohne '.' und '..'.

Liest den Inhalt eines Verzeichnisses.

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für die Dateinamen zu verwendende Zeichenkodierung festlegt. Wenn encoding auf 'buffer' gesetzt ist, werden die zurückgegebenen Dateinamen als <Buffer>-Objekte übergeben.

Wenn options.withFileTypes auf true gesetzt ist, enthält das zurückgegebene Array <fs.Dirent>-Objekte.

import { readdir } from 'node:fs/promises';

try {
  const files = await readdir(path);
  for (const file of files)
    console.log(file);
} catch (err) {
  console.error(err);
}

fsPromises.readFile(path[, options])#

Liest den gesamten Inhalt einer Datei asynchron.

Wenn keine Kodierung angegeben ist (unter Verwendung von options.encoding), werden die Daten als <Buffer>-Objekt zurückgegeben. Andernfalls sind die Daten ein String.

Wenn options ein String ist, dann spezifiziert er die Kodierung.

Wenn der path ein Verzeichnis ist, ist das Verhalten von fsPromises.readFile() plattformspezifisch. Unter macOS, Linux und Windows wird das Promise mit einem Fehler abgelehnt. Unter FreeBSD wird eine Darstellung des Inhalts des Verzeichnisses zurückgegeben.

Ein Beispiel zum Lesen einer package.json-Datei, die sich im selben Verzeichnis wie der ausgeführte Code befindet

import { readFile } from 'node:fs/promises';
try {
  const filePath = new URL('./package.json', import.meta.url);
  const contents = await readFile(filePath, { encoding: 'utf8' });
  console.log(contents);
} catch (err) {
  console.error(err.message);
}
const { readFile } = require('node:fs/promises');
const { resolve } = require('node:path');
async function logFile() {
  try {
    const filePath = resolve('./package.json');
    const contents = await readFile(filePath, { encoding: 'utf8' });
    console.log(contents);
  } catch (err) {
    console.error(err.message);
  }
}
logFile();

Es ist möglich, ein laufendes readFile mit einem <AbortSignal> abzubrechen. Wenn eine Anfrage abgebrochen wird, wird das zurückgegebene Promise mit einem AbortError abgelehnt

import { readFile } from 'node:fs/promises';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const promise = readFile(fileName, { signal });

  // Abort the request before the promise settles.
  controller.abort();

  await promise;
} catch (err) {
  // When a request is aborted - err is an AbortError
  console.error(err);
}

Das Abbrechen einer laufenden Anfrage bricht nicht die einzelnen Betriebssystemanfragen ab, sondern das interne Puffern, das fs.readFile durchführt.

Jedes angegebene <FileHandle> muss das Lesen unterstützen.

fsPromises.readlink(path[, options])#

Liest den Inhalt des symbolischen Links, auf den path verweist. Siehe die POSIX readlink(2)-Dokumentation für weitere Details. Das Promise wird bei Erfolg mit dem linkString erfüllt.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den zurückgegebenen Link-Pfad zu verwendende Zeichencodierung festlegt. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Link-Pfad als <Buffer>-Objekt übergeben.

fsPromises.realpath(path[, options])#

Bestimmt den tatsächlichen Speicherort von path unter Verwendung derselben Semantik wie die Funktion fs.realpath.native().

Es werden nur Pfade unterstützt, die in UTF-8-Strings konvertiert werden können.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den Pfad zu verwendende Zeichencodierung festlegt. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Pfad als <Buffer>-Objekt übergeben.

Wenn Node.js unter Linux mit der musl-libc verknüpft ist, muss das procfs-Dateisystem unter /proc eingehängt sein, damit diese Funktion funktioniert. Glibc hat diese Einschränkung nicht.

fsPromises.rename(oldPath, newPath)#

Benennt oldPath in newPath um.

fsPromises.rmdir(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object> Es sind derzeit keine Optionen verfügbar. Es gab früher Optionen für recursive, maxBusyTries und emfileWait, diese wurden jedoch als veraltet markiert und entfernt. Das options-Argument wird aus Gründen der Abwärtskompatibilität weiterhin akzeptiert, aber nicht verwendet.
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Entfernt das durch path identifizierte Verzeichnis.

Die Verwendung von fsPromises.rmdir() auf eine Datei (kein Verzeichnis) führt dazu, dass das Promise mit einem ENOENT-Fehler unter Windows und einem ENOTDIR-Fehler unter POSIX abgelehnt wird.

Um ein Verhalten ähnlich dem Unix-Befehl rm -rf zu erhalten, verwenden Sie fsPromises.rm() mit den Optionen { recursive: true, force: true }.

fsPromises.rm(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> Wenn true, werden Ausnahmen ignoriert, wenn path nicht existiert. Standard: false.
    • maxRetries <integer> Wenn ein EBUSY-, EMFILE-, ENFILE-, ENOTEMPTY- oder EPERM-Fehler auftritt, wiederholt Node.js den Vorgang mit einem linearen Backoff-Warten von retryDelay Millisekunden länger bei jedem Versuch. Diese Option repräsentiert die Anzahl der Wiederholungen. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 0.
    • recursive <boolean> Wenn true, wird ein rekursives Verzeichnis-Entfernen durchgeführt. Im rekursiven Modus werden Vorgänge bei Fehlern wiederholt. Standard: false.
    • retryDelay <integer> Die Zeitspanne in Millisekunden, die zwischen Wiederholungsversuchen gewartet werden soll. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 100.
  • Rückgabe: <Promise> Wird bei Erfolg mit undefined erfüllt.

Entfernt Dateien und Verzeichnisse (modelliert nach dem Standard-POSIX-Dienstprogramm rm).

fsPromises.stat(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • bigint <boolean> Ob die numerischen Werte im zurückgegebenen <fs.Stats>-Objekt BigInt sein sollen. Standard: false.
    • throwIfNoEntry <boolean> Gibt an, ob eine Ausnahme ausgelöst wird, wenn kein Dateisystemeintrag existiert, anstatt undefined zurückzugeben. Standard: true.
  • Rückgabe: <Promise> Wird bei Erfolg mit dem <fs.Stats>-Objekt für den angegebenen path erfüllt.

fsPromises.statfs(path[, options])#

fsPromises.symlink(target, path[, type])#

Erstellt einen symbolischen Link.

Das type-Argument wird nur auf Windows-Plattformen verwendet und kann 'dir', 'file' oder 'junction' sein. Wenn das type-Argument null ist, erkennt Node.js den Typ von target automatisch und verwendet 'file' oder 'dir'. Wenn das target nicht existiert, wird 'file' verwendet. Windows-Verknüpfungspunkte (Junctions) erfordern, dass der Zielpfad absolut ist. Bei Verwendung von 'junction' wird das target-Argument automatisch zu einem absoluten Pfad normalisiert. Verknüpfungspunkte auf NTFS-Volumes können nur auf Verzeichnisse zeigen.

fsPromises.truncate(path[, len])#

Kürzt den Inhalt bei path auf len Bytes (verkürzt oder erweitert die Länge).

fsPromises.unlink(path)#

Wenn path auf einen symbolischen Link verweist, wird der Link entfernt, ohne die Datei oder das Verzeichnis zu beeinflussen, auf das dieser Link verweist. Wenn path auf einen Dateipfad verweist, der kein symbolischer Link ist, wird die Datei gelöscht. Siehe die POSIX unlink(2)-Dokumentation für weitere Details.

fsPromises.utimes(path, atime, mtime)#

Ändert die Dateisystem-Zeitstempel des Objekts, auf das path verweist.

Die Argumente atime und mtime folgen diesen Regeln:

  • Werte können entweder Zahlen sein, die die Unix-Epochenzeit darstellen, Date-Objekte oder ein numerischer String wie '123456789.0'.
  • Wenn der Wert nicht in eine Zahl konvertiert werden kann oder NaN, Infinity oder -Infinity ist, wird ein Error ausgelöst.

fsPromises.watch(filename[, options])#

  • filename <string> | <Buffer> | <URL>
  • options <string> | <Object>
    • persistent <boolean> Gibt an, ob der Prozess weiterlaufen soll, solange Dateien beobachtet werden. Standard: true.
    • recursive <boolean> Gibt an, ob alle Unterverzeichnisse beobachtet werden sollen oder nur das aktuelle Verzeichnis. Dies gilt, wenn ein Verzeichnis angegeben ist, und nur auf unterstützten Plattformen (siehe Caveats). Standard: false.
    • encoding <string> Gibt die Zeichencodierung an, die für den an den Listener übergebenen Dateinamen verwendet werden soll. Standard: 'utf8'.
    • signal <AbortSignal> Ein <AbortSignal>, das verwendet wird, um zu signalisieren, wann der Beobachter stoppen soll.
    • maxQueue <number> Gibt die Anzahl der Ereignisse an, die zwischen Iterationen des zurückgegebenen <AsyncIterator> in die Warteschlange gestellt werden sollen. Standard: 2048.
    • overflow <string> Entweder 'ignore' oder 'throw', wenn mehr Ereignisse in die Warteschlange gestellt werden sollen, als maxQueue erlaubt. 'ignore' bedeutet, dass Overflow-Ereignisse verworfen werden und eine Warnung ausgegeben wird, während 'throw' bedeutet, dass eine Ausnahme ausgelöst wird. Standard: 'ignore'.
    • ignore <string> | <RegExp> | <Function> | <Array> Zu ignorierende Muster. Strings sind Glob-Muster (unter Verwendung von minimatch), RegExp-Muster werden gegen den Dateinamen geprüft, und Funktionen erhalten den Dateinamen und geben true zurück, um ihn zu ignorieren. Standard: undefined.
  • Rückgabe: <AsyncIterator> von Objekten mit den Eigenschaften
  • eventType <string> Der Typ der Änderung
  • filename <string> | <Buffer> | <null> Der Name der geänderten Datei.

Gibt einen asynchronen Iterator zurück, der Änderungen an filename beobachtet, wobei filename entweder eine Datei oder ein Verzeichnis ist.

const { watch } = require('node:fs/promises');

const ac = new AbortController();
const { signal } = ac;
setTimeout(() => ac.abort(), 10000);

(async () => {
  try {
    const watcher = watch(__filename, { signal });
    for await (const event of watcher)
      console.log(event);
  } catch (err) {
    if (err.name === 'AbortError')
      return;
    throw err;
  }
})();

Auf den meisten Plattformen wird 'rename' ausgegeben, wenn ein Dateiname im Verzeichnis erscheint oder verschwindet.

Alle Caveats für fs.watch() gelten auch für fsPromises.watch().

fsPromises.writeFile(file, data[, options])#

Schreibt Daten asynchron in eine Datei und ersetzt die Datei, falls sie bereits existiert. data kann ein String, ein Puffer, ein <AsyncIterable> oder ein <Iterable>-Objekt sein.

Die Option encoding wird ignoriert, wenn data ein Puffer ist.

Wenn options ein String ist, dann spezifiziert er die Kodierung.

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

Jedes angegebene <FileHandle> muss das Schreiben unterstützen.

Es ist unsicher, fsPromises.writeFile() mehrfach auf dieselbe Datei anzuwenden, ohne auf den Abschluss des Promises zu warten.

Ähnlich wie fsPromises.readFile ist fsPromises.writeFile eine Komfortmethode, die intern mehrere write-Aufrufe durchführt, um den übergebenen Puffer zu schreiben. Erwägen Sie für leistungskritischen Code die Verwendung von fs.createWriteStream() oder filehandle.createWriteStream().

Es ist möglich, ein <AbortSignal> zu verwenden, um ein fsPromises.writeFile() abzubrechen. Der Abbruch ist ein "Best-Effort"-Vorgang, und es ist wahrscheinlich, dass bereits eine gewisse Menge an Daten geschrieben wurde.

import { writeFile } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const data = new Uint8Array(Buffer.from('Hello Node.js'));
  const promise = writeFile('message.txt', data, { signal });

  // Abort the request before the promise settles.
  controller.abort();

  await promise;
} catch (err) {
  // When a request is aborted - err is an AbortError
  console.error(err);
}

Das Abbrechen einer laufenden Anfrage bricht nicht die einzelnen Betriebssystemanfragen ab, sondern das interne Puffern, das fs.writeFile durchführt.

fsPromises.constants#

Gibt ein Objekt zurück, das häufig verwendete Konstanten für Dateisystemoperationen enthält. Das Objekt ist identisch mit fs.constants. Weitere Einzelheiten finden Sie unter FS-Konstanten.

Callback-API#

Die Callback-APIs führen alle Operationen asynchron aus, ohne die Event-Loop zu blockieren, und rufen dann eine Callback-Funktion nach Abschluss oder Fehler auf.

Die Callback-APIs verwenden den zugrunde liegenden Node.js-Threadpool, um Dateisystemoperationen außerhalb des Event-Loop-Threads auszuführen. Diese Operationen sind nicht synchronisiert oder threadsicher. Es ist Vorsicht geboten, wenn mehrere gleichzeitige Modifikationen an derselben Datei vorgenommen werden, da es sonst zu Datenbeschädigungen kommen kann.

fs.access(path[, mode], callback)#

Testet die Berechtigungen eines Benutzers für die durch path angegebene Datei oder das Verzeichnis. Das mode-Argument ist eine optionale Ganzzahl, die die durchzuführenden Zugriffsprüfungen angibt. mode sollte entweder der Wert fs.constants.F_OK sein oder eine Maske, die aus der bitweisen ODER-Verknüpfung von fs.constants.R_OK, fs.constants.W_OK und fs.constants.X_OK besteht (z. B. fs.constants.W_OK | fs.constants.R_OK). Prüfen Sie Dateizugriffskonstanten für mögliche mode-Werte.

Das letzte Argument, callback, ist eine Callback-Funktion, die mit einem möglichen Fehlerargument aufgerufen wird. Wenn eine der Zugriffsprüfungen fehlschlägt, ist das Fehlerargument ein Error-Objekt. Die folgenden Beispiele prüfen, ob package.json existiert und ob es lesbar oder schreibbar ist.

import { access, constants } from 'node:fs';

const file = 'package.json';

// Check if the file exists in the current directory.
access(file, constants.F_OK, (err) => {
  console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});

// Check if the file is readable.
access(file, constants.R_OK, (err) => {
  console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});

// Check if the file is writable.
access(file, constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});

// Check if the file is readable and writable.
access(file, constants.R_OK | constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});

Verwenden Sie nicht fs.access(), um die Zugänglichkeit einer Datei zu prüfen, bevor Sie fs.open(), fs.readFile() oder fs.writeFile() aufrufen. Dies führt zu einer Race-Condition, da andere Prozesse den Status der Datei zwischen den beiden Aufrufen ändern könnten. Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler behandeln, falls die Datei nicht zugänglich ist.

Schreiben (NICHT EMPFOHLEN)

import { access, open, close } from 'node:fs';

access('myfile', (err) => {
  if (!err) {
    console.error('myfile already exists');
    return;
  }

  open('myfile', 'wx', (err, fd) => {
    if (err) throw err;

    try {
      writeMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

Schreiben (EMPFOHLEN)

import { open, close } from 'node:fs';

open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

Lesen (NICHT EMPFOHLEN)

import { access, open, close } from 'node:fs';
access('myfile', (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  open('myfile', 'r', (err, fd) => {
    if (err) throw err;

    try {
      readMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

Lesen (EMPFOHLEN)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

Die "nicht empfohlenen" Beispiele oben prüfen auf Zugänglichkeit und verwenden dann die Datei; die "empfohlenen" Beispiele sind besser, weil sie die Datei direkt verwenden und den Fehler, falls vorhanden, behandeln.

Prüfen Sie die Zugänglichkeit einer Datei im Allgemeinen nur, wenn die Datei nicht direkt verwendet wird, zum Beispiel wenn ihre Zugänglichkeit ein Signal von einem anderen Prozess ist.

Unter Windows können Zugriffssteuerungsrichtlinien (ACLs) für ein Verzeichnis den Zugriff auf eine Datei oder ein Verzeichnis einschränken. Die Funktion fs.access() prüft jedoch nicht die ACL und kann daher melden, dass ein Pfad zugänglich ist, selbst wenn die ACL den Benutzer daran hindert, ihn zu lesen oder zu schreiben.

fs.appendFile(path, data[, options], callback)#

Hängt Daten asynchron an eine Datei an und erstellt die Datei, falls sie noch nicht existiert. data kann ein String oder ein <Buffer> sein.

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
});

Wenn options ein String ist, dann spezifiziert er die Codierung

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', 'utf8', callback);

Der path kann als numerischer Dateideskriptor angegeben werden, der zum Anhängen geöffnet wurde (unter Verwendung von fs.open() oder fs.openSync()). Der Dateideskriptor wird nicht automatisch geschlossen.

import { open, close, appendFile } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('message.txt', 'a', (err, fd) => {
  if (err) throw err;

  try {
    appendFile(fd, 'data to append', 'utf8', (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
});

fs.chmod(path, mode, callback)#

Ändert asynchron die Berechtigungen einer Datei. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX chmod(2)-Dokumentation für weitere Details.

import { chmod } from 'node:fs';

chmod('my_file.txt', 0o775, (err) => {
  if (err) throw err;
  console.log('The permissions for file "my_file.txt" have been changed!');
});
Dateimodi#

Das mode-Argument, das sowohl in den Methoden fs.chmod() als auch fs.chmodSync() verwendet wird, ist eine numerische Bitmaske, die unter Verwendung einer logischen ODER-Verknüpfung der folgenden Konstanten erstellt wird:

Konstante Oktal Beschreibung
fs.constants.S_IRUSR 0o400 Lesen durch Eigentümer
fs.constants.S_IWUSR 0o200 Schreiben durch Eigentümer
fs.constants.S_IXUSR 0o100 Ausführen/Suchen durch Eigentümer
fs.constants.S_IRGRP 0o40 Lesen durch Gruppe
fs.constants.S_IWGRP 0o20 Schreiben durch Gruppe
fs.constants.S_IXGRP 0o10 Ausführen/Suchen durch Gruppe
fs.constants.S_IROTH 0o4 Lesen durch Andere
fs.constants.S_IWOTH 0o2 Schreiben durch Andere
fs.constants.S_IXOTH 0o1 Ausführen/Suchen durch Andere

Eine einfachere Methode zum Konstruieren des mode besteht darin, eine Sequenz von drei Oktalziffern zu verwenden (z. B. 765). Die linkeste Ziffer (7 im Beispiel) gibt die Berechtigungen für den Dateieigentümer an. Die mittlere Ziffer (6 im Beispiel) gibt die Berechtigungen für die Gruppe an. Die rechteste Ziffer (5 im Beispiel) gibt die Berechtigungen für andere an.

Zahl Beschreibung
7 lesen, schreiben und ausführen
6 lesen und schreiben
5 lesen und ausführen
4 nur lesen
3 schreiben und ausführen
2 nur schreiben
1 nur ausführen
0 keine Berechtigung

Zum Beispiel bedeutet der Oktalwert 0o765:

  • Der Eigentümer darf die Datei lesen, schreiben und ausführen.
  • Die Gruppe darf die Datei lesen und schreiben.
  • Andere dürfen die Datei lesen und ausführen.

Wenn Rohzahlen verwendet werden, wo Dateimodi erwartet werden, kann jeder Wert größer als 0o777 zu plattformspezifischem Verhalten führen, das nicht konsistent funktioniert. Daher sind Konstanten wie S_ISVTX, S_ISGID oder S_ISUID nicht in fs.constants verfügbar.

Caveats: Unter Windows kann nur die Schreibberechtigung geändert werden, und die Unterscheidung zwischen den Berechtigungen von Gruppe, Eigentümer oder anderen ist nicht implementiert.

fs.chown(path, uid, gid, callback)#

Ändert asynchron Eigentümer und Gruppe einer Datei. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX chown(2)-Dokumentation für weitere Details.

fs.close(fd[, callback])#

Schließt den Dateideskriptor. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Der Aufruf von fs.close() auf einen Dateideskriptor (fd), der derzeit durch eine andere fs-Operation verwendet wird, kann zu undefiniertem Verhalten führen.

Siehe die POSIX close(2)-Dokumentation für weitere Details.

fs.copyFile(src, dest[, mode], callback)#

Kopiert src asynchron nach dest. Standardmäßig wird dest überschrieben, falls sie bereits existiert. An die Callback-Funktion werden keine anderen Argumente als ein möglicher Fehler übergeben. Node.js gibt keine Garantien bezüglich der Atomarität des Kopiervorgangs. Wenn ein Fehler auftritt, nachdem die Zieldatei zum Schreiben geöffnet wurde, versucht Node.js, das Ziel zu entfernen.

mode ist eine optionale Ganzzahl, die das Verhalten des Kopiervorgangs angibt. Es ist möglich, eine Maske aus dem bitweisen ODER von zwei oder mehr Werten zu erstellen (z. B. fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE).

  • fs.constants.COPYFILE_EXCL: Die Kopieroperation schlägt fehl, wenn dest bereits existiert.
  • fs.constants.COPYFILE_FICLONE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, wird ein Fallback-Kopiermechanismus verwendet.
  • fs.constants.COPYFILE_FICLONE_FORCE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, schlägt die Operation fehl.
import { copyFile, constants } from 'node:fs';

function callback(err) {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
}

// destination.txt will be created or overwritten by default.
copyFile('source.txt', 'destination.txt', callback);

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback);

fs.cp(src, dest[, options], callback)#

  • src <string> | <URL> Quellpfad zum Kopieren.
  • dest <string> | <URL> Zielpfad zum Kopieren.
  • options <Object>
    • dereference <boolean> Dereferenzierung von symbolischen Links. Standard: false.
    • errorOnExist <boolean> wenn force false ist und das Ziel existiert, einen Fehler werfen. Standard: false.
    • filter <Function> Funktion zum Filtern kopierter Dateien/Verzeichnisse. Geben Sie true zurück, um das Element zu kopieren, false, um es zu ignorieren. Beim Ignorieren eines Verzeichnisses wird auch dessen gesamter Inhalt übersprungen. Kann auch ein Promise zurückgeben, das zu true oder false aufgelöst wird. Standard: undefined.
      • src <string> Quellpfad zum Kopieren.
      • dest <string> Zielpfad zum Kopieren.
      • Rückgabe: <boolean> | <Promise> Ein Wert, der in boolean konvertierbar ist, oder ein Promise, das zu einem solchen Wert aufgelöst wird.
    • force <boolean> Bestehende Datei oder bestehendes Verzeichnis überschreiben. Die Kopieroperation ignoriert Fehler, wenn Sie dies auf false setzen und das Ziel existiert. Verwenden Sie die errorOnExist-Option, um dieses Verhalten zu ändern. Standard: true.
    • mode <integer> Modifikatoren für den Kopiervorgang. Standard: 0. Siehe mode-Flag von fs.copyFile().
    • preserveTimestamps <boolean> Wenn true, werden Zeitstempel von src beibehalten. Standard: false.
    • recursive <boolean> Verzeichnisse rekursiv kopieren Standard: false
    • verbatimSymlinks <boolean> Wenn true, wird die Pfadauflösung für symbolische Links übersprungen. Standard: false
  • callback <Function>

Kopiert die gesamte Verzeichnisstruktur asynchron von src nach dest, einschließlich Unterverzeichnisse und Dateien.

Beim Kopieren eines Verzeichnisses in ein anderes Verzeichnis werden keine Globs unterstützt und das Verhalten entspricht cp dir1/ dir2/.

fs.createReadStream(path[, options])#

options können start- und end-Werte enthalten, um einen Bereich von Bytes aus der Datei zu lesen, anstatt die gesamte Datei. Sowohl start als auch end sind inklusiv und beginnen bei 0 zu zählen, zulässige Werte liegen im Bereich [0, Number.MAX_SAFE_INTEGER]. Wenn fd angegeben ist und start weggelassen oder undefined ist, liest fs.createReadStream() sequenziell ab der aktuellen Dateiposition. Die encoding kann jede der von <Buffer> akzeptierten sein.

Wenn fd angegeben ist, ignoriert ReadStream das path-Argument und verwendet den angegebenen Dateideskriptor. Das bedeutet, dass kein 'open'-Ereignis ausgelöst wird. fd sollte blockierend sein; nicht-blockierende fds sollten an <net.Socket> übergeben werden.

Wenn fd auf ein Zeichengerät zeigt, das nur blockierende Lesevorgänge unterstützt (wie Tastatur oder Soundkarte), werden die Lesevorgänge nicht beendet, bis Daten verfügbar sind. Dies kann verhindern, dass der Prozess beendet wird und der Stream sich auf natürliche Weise schließt.

Standardmäßig sendet der Stream ein 'close'-Ereignis, nachdem er zerstört wurde. Setzen Sie die emitClose-Option auf false, um dieses Verhalten zu ändern.

Durch Bereitstellung der fs-Option ist es möglich, die entsprechenden fs-Implementierungen für open, read und close zu überschreiben. Wenn die fs-Option bereitgestellt wird, ist ein Override für read erforderlich. Wenn kein fd bereitgestellt wird, ist auch ein Override für open erforderlich. Wenn autoClose auf true gesetzt ist, ist auch ein Override für close erforderlich.

import { createReadStream } from 'node:fs';

// Create a stream from some character device.
const stream = createReadStream('/dev/input/event0');
setTimeout(() => {
  stream.close(); // This may not close the stream.
  // Artificially marking end-of-stream, as if the underlying resource had
  // indicated end-of-file by itself, allows the stream to close.
  // This does not cancel pending read operations, and if there is such an
  // operation, the process may still not be able to exit successfully
  // until it finishes.
  stream.push(null);
  stream.read(0);
}, 100);

Wenn autoClose auf false gesetzt ist, wird der Dateideskriptor auch bei einem Fehler nicht geschlossen. Es liegt in der Verantwortung der Anwendung, ihn zu schließen und sicherzustellen, dass kein Dateideskriptor verloren geht (Leck). Wenn autoClose auf true gesetzt ist (Standardverhalten), wird der Dateideskriptor bei 'error' oder 'end' automatisch geschlossen.

mode legt den Dateimodus (Berechtigungs- und Sticky-Bits) fest, aber nur, wenn die Datei erstellt wurde.

Ein Beispiel zum Lesen der letzten 10 Bytes einer 100 Bytes langen Datei

import { createReadStream } from 'node:fs';

createReadStream('sample.txt', { start: 90, end: 99 });

Wenn options ein String ist, dann spezifiziert er die Kodierung.

fs.createWriteStream(path[, options])#

options können auch eine start-Option enthalten, um das Schreiben von Daten an einer Position nach dem Anfang der Datei zu ermöglichen. Zulässige Werte liegen im Bereich [0, Number.MAX_SAFE_INTEGER]. Die Modifikation einer Datei anstelle ihres Ersetzens erfordert möglicherweise, dass die flags-Option auf r+ anstelle des Standardwerts w gesetzt wird. Die encoding kann jede der von <Buffer> akzeptierten sein.

Wenn autoClose auf true gesetzt ist (Standardverhalten), wird der Dateideskriptor bei 'error' oder 'finish' automatisch geschlossen. Wenn autoClose auf false gesetzt ist, wird der Dateideskriptor auch bei einem Fehler nicht geschlossen. Es liegt in der Verantwortung der Anwendung, ihn zu schließen und sicherzustellen, dass kein Dateideskriptor verloren geht.

Standardmäßig sendet der Stream ein 'close'-Ereignis, nachdem er zerstört wurde. Setzen Sie die emitClose-Option auf false, um dieses Verhalten zu ändern.

Durch Bereitstellung der fs-Option ist es möglich, die entsprechenden fs-Implementierungen für open, write, writev und close zu überschreiben. Das Überschreiben von write() ohne writev() kann die Leistung beeinträchtigen, da einige Optimierungen (_writev()) deaktiviert werden. Wenn die fs-Option bereitgestellt wird, sind Overrides für mindestens eines der Elemente write und writev erforderlich. Wenn keine fd-Option bereitgestellt wird, ist auch ein Override für open erforderlich. Wenn autoClose auf true gesetzt ist, ist auch ein Override für close erforderlich.

Wie bei <fs.ReadStream> ignoriert <fs.WriteStream> das path-Argument, wenn ein fd angegeben ist, und verwendet den angegebenen Dateideskriptor. Das bedeutet, dass kein 'open'-Ereignis ausgelöst wird. fd sollte blockierend sein; nicht-blockierende fds sollten an <net.Socket> übergeben werden.

Wenn options ein String ist, dann spezifiziert er die Kodierung.

fs.exists(path, callback)#

Stabilität: 0 - Veraltet: Verwenden Sie stattdessen fs.stat() oder fs.access().

Testen Sie durch Prüfung beim Dateisystem, ob das Element am angegebenen path existiert. Rufen Sie dann das callback-Argument mit true oder false auf.

import { exists } from 'node:fs';

exists('/etc/passwd', (e) => {
  console.log(e ? 'it exists' : 'no passwd!');
});

Die Parameter für diesen Callback sind nicht konsistent mit anderen Node.js-Callbacks. Normalerweise ist der erste Parameter eines Node.js-Callbacks ein err-Parameter, optional gefolgt von anderen Parametern. Der fs.exists()-Callback hat nur einen booleschen Parameter. Dies ist ein Grund, warum fs.access() anstelle von fs.exists() empfohlen wird.

Wenn path ein symbolischer Link ist, wird ihm gefolgt. Wenn path also existiert, aber auf ein nicht existierendes Element zeigt, erhält der Callback den Wert false.

Es wird nicht empfohlen, fs.exists() zu verwenden, um die Existenz einer Datei zu prüfen, bevor Sie fs.open(), fs.readFile() oder fs.writeFile() aufrufen. Dies führt zu einer Race-Condition, da andere Prozesse den Status der Datei zwischen den beiden Aufrufen ändern könnten. Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler behandeln, der ausgelöst wird, wenn die Datei nicht existiert.

Schreiben (NICHT EMPFOHLEN)

import { exists, open, close } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    console.error('myfile already exists');
  } else {
    open('myfile', 'wx', (err, fd) => {
      if (err) throw err;

      try {
        writeMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  }
});

Schreiben (EMPFOHLEN)

import { open, close } from 'node:fs';
open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

Lesen (NICHT EMPFOHLEN)

import { open, close, exists } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    open('myfile', 'r', (err, fd) => {
      if (err) throw err;

      try {
        readMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  } else {
    console.error('myfile does not exist');
  }
});

Lesen (EMPFOHLEN)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

Die "nicht empfohlenen" Beispiele oben prüfen auf Existenz und verwenden dann die Datei; die "empfohlenen" Beispiele sind besser, weil sie die Datei direkt verwenden und den Fehler, falls vorhanden, behandeln.

Prüfen Sie die Existenz einer Datei im Allgemeinen nur, wenn die Datei nicht direkt verwendet wird, zum Beispiel wenn ihre Existenz ein Signal von einem anderen Prozess ist.

fs.fchmod(fd, mode, callback)#

Setzt die Berechtigungen für die Datei. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX fchmod(2)-Dokumentation für weitere Details.

fs.fchown(fd, uid, gid, callback)#

Setzt den Eigentümer der Datei. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX fchown(2)-Dokumentation für weitere Details.

fs.fdatasync(fd, callback)#

Erzwingt alle aktuell in der Warteschlange befindlichen E/A-Operationen, die mit der Datei verknüpft sind, in den synchronisierten E/A-Abschlusszustand des Betriebssystems. Siehe die POSIX fdatasync(2)-Dokumentation für Details. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

fs.fstat(fd[, options], callback)#

Ruft den Callback mit den <fs.Stats> für den Dateideskriptor auf.

Siehe die POSIX fstat(2)-Dokumentation für weitere Details.

fs.fsync(fd, callback)#

Fordert an, dass alle Daten für den geöffneten Dateideskriptor auf das Speichergerät geleert (flushed) werden. Die spezifische Implementierung ist betriebssystem- und geräteabhängig. Siehe die POSIX fsync(2)-Dokumentation für weitere Details. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

fs.ftruncate(fd[, len], callback)#

Kürzt den Dateideskriptor. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX ftruncate(2)-Dokumentation für weitere Details.

Wenn die durch den Dateideskriptor bezeichnete Datei größer als len Bytes war, bleiben nur die ersten len Bytes in der Datei erhalten.

Zum Beispiel behält das folgende Programm nur die ersten vier Bytes der Datei bei

import { open, close, ftruncate } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('temp.txt', 'r+', (err, fd) => {
  if (err) throw err;

  try {
    ftruncate(fd, 4, (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    if (err) throw err;
  }
});

Wenn die Datei zuvor kürzer als len Bytes war, wird sie erweitert, und der erweiterte Teil wird mit Null-Bytes ('\0') gefüllt

Wenn len negativ ist, wird 0 verwendet.

fs.futimes(fd, atime, mtime, callback)#

Ändert die Dateisystem-Zeitstempel des Objekts, auf das der bereitgestellte Dateideskriptor verweist. Siehe fs.utimes().

fs.glob(pattern[, options], callback)#

  • pattern <string> | <string[]>

  • options <Object>

    • cwd <string> | <URL> Aktuelles Arbeitsverzeichnis. Standard: process.cwd()
    • exclude <Function> | <string[]> Funktion zum Filtern von Dateien/Verzeichnissen oder eine Liste von Glob-Mustern, die ausgeschlossen werden sollen. Wenn eine Funktion bereitgestellt wird, geben Sie true zurück, um das Element auszuschließen, und false, um es einzuschließen. Standard: undefined.
    • withFileTypes <boolean> true, wenn die Glob-Funktion Pfade als Dirents zurückgeben soll, sonst false. Standard: false.
  • callback <Function>

  • Ruft die Dateien ab, die dem angegebenen Muster entsprechen.

import { glob } from 'node:fs';

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});
const { glob } = require('node:fs');

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});

fs.lchmod(path, mode, callback)#

Stabilität: 0 - Veraltet

Ändert die Berechtigungen für einen symbolischen Link. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Diese Methode ist nur unter macOS implementiert.

Siehe die POSIX lchmod(2)-Dokumentation für weitere Details.

fs.lchown(path, uid, gid, callback)#

Setzt den Eigentümer des symbolischen Links. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX lchown(2)-Dokumentation für weitere Details.

fs.lutimes(path, atime, mtime, callback)#

Ändert die Zugriffs- und Änderungszeiten einer Datei auf die gleiche Weise wie fs.utimes(), mit dem Unterschied, dass wenn der Pfad auf einen symbolischen Link verweist, der Link nicht dereferenziert wird: Stattdessen werden die Zeitstempel des symbolischen Links selbst geändert.

Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

fs.link(existingPath, newPath, callback)#

Erstellt einen neuen Link von existingPath zu newPath. Siehe die POSIX link(2)-Dokumentation für weitere Details. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

fs.lstat(path[, options], callback)#

Ruft die <fs.Stats> für den symbolischen Link ab, auf den der Pfad verweist. Der Callback erhält zwei Argumente (err, stats), wobei stats ein <fs.Stats>-Objekt ist. lstat() ist identisch mit stat(), außer dass wenn path ein symbolischer Link ist, der Link selbst abgefragt wird und nicht die Datei, auf die er verweist.

Siehe die POSIX lstat(2)-Dokumentation für weitere Details.

fs.mkdir(path[, options], callback)#

Erstellt ein Verzeichnis asynchron.

Der Callback erhält einen möglichen Fehler und, falls recursive auf true gesetzt ist, den ersten erstellten Verzeichnispfad, (err[, path]). path kann weiterhin undefined sein, wenn recursive auf true gesetzt ist und kein Verzeichnis erstellt wurde (z. B. wenn es bereits vorher existierte).

Das optionale options-Argument kann eine Ganzzahl sein, die mode (Berechtigungs- und Sticky-Bits) angibt, oder ein Objekt mit einer mode-Eigenschaft und einer recursive-Eigenschaft, die angibt, ob übergeordnete Verzeichnisse erstellt werden sollen. Der Aufruf von fs.mkdir(), wenn path ein existierendes Verzeichnis ist, führt nur zu einem Fehler, wenn recursive auf false gesetzt ist. Wenn recursive auf false gesetzt ist und das Verzeichnis existiert, tritt ein EEXIST-Fehler auf.

import { mkdir } from 'node:fs';

// Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist.
mkdir('./tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

Unter Windows führt die Verwendung von fs.mkdir() auf das Stammverzeichnis, selbst mit Rekursion, zu einem Fehler.

import { mkdir } from 'node:fs';

mkdir('/', { recursive: true }, (err) => {
  // => [Error: EPERM: operation not permitted, mkdir 'C:\']
});

Siehe die POSIX mkdir(2)-Dokumentation für weitere Details.

fs.mkdtemp(prefix[, options], callback)#

Erstellt ein eindeutiges temporäres Verzeichnis.

Generiert sechs zufällige Zeichen, die an ein erforderliches prefix angehängt werden, um ein eindeutiges temporäres Verzeichnis zu erstellen. Aufgrund von Plattform-Inkonsistenzen sollten nachgestellte X-Zeichen im prefix vermieden werden. Einige Plattformen, insbesondere BSDs, können mehr als sechs zufällige Zeichen zurückgeben und nachgestellte X-Zeichen im prefix durch zufällige Zeichen ersetzen.

Der erstellte Verzeichnispfad wird als String an den zweiten Parameter des Callbacks übergeben.

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die zu verwendende Zeichenkodierung festlegt.

import { mkdtemp } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2
});

Die Methode fs.mkdtemp() hängt die sechs zufällig ausgewählten Zeichen direkt an den prefix-String an. Wenn beispielsweise ein Verzeichnis /tmp gegeben ist und die Absicht besteht, ein temporäres Verzeichnis innerhalb von /tmp zu erstellen, muss der prefix mit einem nachgestellten, plattformspezifischen Pfadtrennzeichen (require('node:path').sep) enden.

import { tmpdir } from 'node:os';
import { mkdtemp } from 'node:fs';

// The parent directory for the new temporary directory
const tmpDir = tmpdir();

// This method is *INCORRECT*:
mkdtemp(tmpDir, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Will print something similar to `/tmpabc123`.
  // A new temporary directory is created at the file system root
  // rather than *within* the /tmp directory.
});

// This method is *CORRECT*:
import { sep } from 'node:path';
mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Will print something similar to `/tmp/abc123`.
  // A new temporary directory is created within
  // the /tmp directory.
});

fs.open(path[, flags[, mode]], callback)#

Asynchrones Öffnen einer Datei. Siehe die POSIX open(2)-Dokumentation für weitere Details.

mode legt den Dateimodus (Berechtigungs- und Sticky-Bits) fest, aber nur, wenn die Datei erstellt wurde. Unter Windows kann nur die Schreibberechtigung manipuliert werden; siehe fs.chmod().

Der Callback erhält zwei Argumente (err, fd).

Einige Zeichen (< > : " / \ | ? *) sind unter Windows reserviert, wie in Benennung von Dateien, Pfaden und Namespaces dokumentiert. Wenn unter NTFS der Dateiname einen Doppelpunkt enthält, öffnet Node.js einen Dateisystem-Stream, wie auf dieser MSDN-Seite beschrieben.

Funktionen, die auf fs.open() basieren, weisen dieses Verhalten ebenfalls auf: fs.writeFile(), fs.readFile() usw.

fs.openAsBlob(path[, options])#

Gibt einen <Blob> zurück, dessen Daten durch die angegebene Datei gesichert sind.

Die Datei darf nach der Erstellung des <Blob> nicht modifiziert werden. Jede Modifikation führt dazu, dass das Lesen der <Blob>-Daten mit einem DOMException-Fehler fehlschlägt. Synchronisierte stat-Operationen auf der Datei erfolgen, wenn das Blob erstellt wird und vor jedem Lesevorgang, um zu erkennen, ob die Dateidaten auf dem Datenträger modifiziert wurden.

import { openAsBlob } from 'node:fs';

const blob = await openAsBlob('the.file.txt');
const ab = await blob.arrayBuffer();
blob.stream();
const { openAsBlob } = require('node:fs');

(async () => {
  const blob = await openAsBlob('the.file.txt');
  const ab = await blob.arrayBuffer();
  blob.stream();
})();

fs.opendir(path[, options], callback)#

Öffnet asynchron ein Verzeichnis. Siehe die POSIX opendir(3)-Dokumentation für weitere Details.

Erstellt ein <fs.Dir>-Objekt, das alle weiteren Funktionen zum Lesen und Bereinigen des Verzeichnisses enthält.

Die encoding-Option legt die Kodierung für den path beim Öffnen des Verzeichnisses und für nachfolgende Lesevorgänge fest.

fs.read(fd, buffer, offset, length, position, callback)#

  • fd <integer>
  • buffer <Buffer> | <TypedArray> | <DataView> Der Puffer, in den die Daten geschrieben werden sollen.
  • offset <integer> Die Position im buffer, an die die Daten geschrieben werden sollen.
  • length <integer> Die Anzahl der zu lesenden Bytes.
  • position <integer> | <bigint> | <null> Gibt an, wo in der Datei mit dem Lesen begonnen werden soll. Wenn position null oder -1 ist, werden Daten von der aktuellen Dateiposition gelesen und die Dateiposition wird aktualisiert. Wenn position eine nicht-negative Ganzzahl ist, bleibt die Dateiposition unverändert.
  • callback <Function>

Liest Daten aus der durch fd angegebenen Datei.

Der Callback erhält drei Argumente, (err, bytesRead, buffer).

Wenn die Datei nicht gleichzeitig geändert wird, ist das Dateiende erreicht, wenn die Anzahl der gelesenen Bytes Null ist.

Wenn diese Methode als ihre util.promisify()-Version aufgerufen wird, gibt sie ein Promise für ein Object mit den Eigenschaften bytesRead und buffer zurück.

Die Methode fs.read() liest Daten aus der durch den Dateideskriptor (fd) angegebenen Datei. Das length-Argument gibt die maximale Anzahl von Bytes an, die Node.js vom Kernel zu lesen versucht. Die tatsächliche Anzahl der gelesenen Bytes (bytesRead) kann jedoch aus verschiedenen Gründen geringer sein als die angegebene length.

Zum Beispiel

  • Wenn die Datei kürzer als die angegebene length ist, wird bytesRead auf die tatsächliche Anzahl der gelesenen Bytes gesetzt.
  • Wenn die Datei auf ein EOF (End of File) stößt, bevor der Puffer gefüllt werden konnte, liest Node.js alle verfügbaren Bytes, bis EOF erreicht ist, und der bytesRead-Parameter im Callback gibt die tatsächliche Anzahl der gelesenen Bytes an, die geringer sein kann als die angegebene length.
  • Wenn sich die Datei in einem langsamen Netzwerk-filesystem befindet oder ein anderes Problem während des Lesens auftritt, kann bytesRead geringer sein als die angegebene length.

Daher ist es wichtig, bei der Verwendung von fs.read() den bytesRead-Wert zu überprüfen, um festzustellen, wie viele Bytes tatsächlich aus der Datei gelesen wurden. Abhängig von Ihrer Anwendungslogik müssen Sie möglicherweise Fälle behandeln, in denen bytesRead geringer ist als die angegebene length, z. B. durch das Umschließen des Leseaufrufs in einer Schleife, wenn Sie eine Mindestanzahl an Bytes benötigen.

Dieses Verhalten ist ähnlich wie bei der POSIX preadv2-Funktion.

fs.read(fd[, options], callback)#

Ähnlich wie die Funktion fs.read() nimmt diese Version ein optionales options-Objekt entgegen. Wenn kein options-Objekt angegeben ist, werden die Standardwerte wie oben verwendet.

fs.read(fd, buffer[, options], callback)#

Ähnlich wie die Funktion fs.read() nimmt diese Version ein optionales options-Objekt entgegen. Wenn kein options-Objekt angegeben ist, werden die Standardwerte wie oben verwendet.

fs.readdir(path[, options], callback)#

Liest den Inhalt eines Verzeichnisses. Der Callback erhält zwei Argumente (err, files), wobei files ein Array der Namen der Dateien im Verzeichnis ist, exklusive '.' und '..'.

Siehe die POSIX readdir(3)-Dokumentation für weitere Details.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für die Dateinamen zu verwendende Zeichencodierung festlegt, die an den Callback übergeben wird. Wenn die encoding auf 'buffer' gesetzt ist, werden die zurückgegebenen Dateinamen als <Buffer>-Objekte übergeben.

Wenn options.withFileTypes auf true gesetzt ist, enthält das files-Array <fs.Dirent>-Objekte.

fs.readFile(path[, options], callback)#

Liest den gesamten Inhalt einer Datei asynchron.

import { readFile } from 'node:fs';

readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});

Der Callback erhält zwei Argumente (err, data), wobei data der Inhalt der Datei ist.

Wenn keine Codierung angegeben ist, wird der Rohpuffer zurückgegeben.

Wenn options ein String ist, dann spezifiziert er die Codierung

import { readFile } from 'node:fs';

readFile('/etc/passwd', 'utf8', callback);

Wenn der Pfad ein Verzeichnis ist, ist das Verhalten von fs.readFile() und fs.readFileSync() plattformspezifisch. Auf macOS, Linux und Windows wird ein Fehler zurückgegeben. Auf FreeBSD wird eine Darstellung des Inhalts des Verzeichnisses zurückgegeben.

import { readFile } from 'node:fs';

// macOS, Linux, and Windows
readFile('<directory>', (err, data) => {
  // => [Error: EISDIR: illegal operation on a directory, read <directory>]
});

//  FreeBSD
readFile('<directory>', (err, data) => {
  // => null, <data>
});

Es ist möglich, eine laufende Anfrage mit einem AbortSignal abzubrechen. Wenn eine Anfrage abgebrochen wird, wird der Callback mit einem AbortError aufgerufen.

import { readFile } from 'node:fs';

const controller = new AbortController();
const signal = controller.signal;
readFile(fileInfo[0].name, { signal }, (err, buf) => {
  // ...
});
// When you want to abort the request
controller.abort();

Die Funktion fs.readFile() puffert die gesamte Datei. Um die Speicherkosten zu minimieren, ziehen Sie nach Möglichkeit das Streaming über fs.createReadStream() vor.

Das Abbrechen einer laufenden Anfrage bricht nicht die einzelnen Betriebssystemanfragen ab, sondern das interne Puffern, das fs.readFile durchführt.

Dateideskriptoren#
  1. Jeder angegebene Dateideskriptor muss das Lesen unterstützen.
  2. Wenn ein Dateideskriptor als path angegeben ist, wird er nicht automatisch geschlossen.
  3. Das Lesen beginnt an der aktuellen Position. Wenn die Datei beispielsweise bereits 'Hello World' enthielt und sechs Bytes mit dem Dateideskriptor gelesen wurden, würde der Aufruf von fs.readFile() mit demselben Dateideskriptor 'World' ergeben, anstatt 'Hello World'.
Leistungsaspekte#

Die Methode fs.readFile() liest asynchron den Inhalt einer Datei stückweise in den Speicher, wodurch die Event-Loop zwischen jedem Stück wechseln kann. Dies ermöglicht es dem Lesevorgang, weniger Auswirkungen auf andere Aktivitäten zu haben, die möglicherweise den zugrunde liegenden libuv-Threadpool nutzen, bedeutet aber, dass es länger dauert, eine vollständige Datei in den Speicher zu lesen.

Der zusätzliche Lese-Overhead kann auf verschiedenen Systemen stark variieren und hängt von der Art der gelesenen Datei ab. Wenn der Dateityp keine reguläre Datei ist (z. B. ein Pipe) und Node.js nicht in der Lage ist, eine tatsächliche Dateigröße zu bestimmen, lädt jeder Lesevorgang 64 KiB an Daten. Für reguläre Dateien verarbeitet jeder Lesevorgang 512 KiB an Daten.

Für Anwendungen, die ein möglichst schnelles Lesen von Dateiinhalten erfordern, ist es besser, direkt fs.read() zu verwenden und den Anwendungscode das Lesen des vollständigen Inhalts der Datei selbst verwalten zu lassen.

Das Node.js GitHub-Issue #25741 bietet weitere Informationen und eine detaillierte Analyse der Leistung von fs.readFile() für mehrere Dateigrößen in verschiedenen Node.js-Versionen.

fs.readlink(path[, options], callback)#

Liest den Inhalt des symbolischen Links, auf den path verweist. Der Callback erhält zwei Argumente (err, linkString).

Siehe die POSIX readlink(2)-Dokumentation für weitere Details.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den Link-Pfad zu verwendende Zeichencodierung festlegt, die an den Callback übergeben wird. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Link-Pfad als <Buffer>-Objekt übergeben.

fs.readv(fd, buffers[, position], callback)#

Liest aus einer durch fd angegebenen Datei und schreibt in ein Array von ArrayBufferViews unter Verwendung von readv().

position ist der Offset vom Anfang der Datei, ab dem Daten gelesen werden sollen. Wenn typeof position !== 'number', werden die Daten ab der aktuellen Position gelesen.

Der Callback erhält drei Argumente: err, bytesRead und buffers. bytesRead ist die Anzahl der aus der Datei gelesenen Bytes.

Wenn diese Methode als ihre util.promisify()-Version aufgerufen wird, gibt sie ein Promise für ein Object mit den Eigenschaften bytesRead und buffers zurück.

fs.realpath(path[, options], callback)#

Berechnet asynchron den kanonischen Pfadnamen durch Auflösung von ., .. und symbolischen Links.

Ein kanonischer Pfadname ist nicht notwendigerweise eindeutig. Hardlinks und Bind-Mounts können eine Dateisystementität über viele Pfadnamen zugänglich machen.

Diese Funktion verhält sich wie realpath(3), mit einigen Ausnahmen:

  1. Auf Systemen, bei denen die Groß-/Kleinschreibung nicht beachtet wird, erfolgt keine Konvertierung.

  2. Die maximale Anzahl symbolischer Links ist plattformunabhängig und im Allgemeinen (viel) höher als das, was die native realpath(3)-Implementierung unterstützt.

Der Callback erhält zwei Argumente (err, resolvedPath). Kann process.cwd zur Auflösung relativer Pfade verwenden.

Es werden nur Pfade unterstützt, die in UTF-8-Strings konvertiert werden können.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den Pfad zu verwendende Zeichencodierung festlegt, die an den Callback übergeben wird. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Pfad als <Buffer>-Objekt übergeben.

Wenn path zu einem Socket oder einer Pipe aufgelöst wird, gibt die Funktion einen systemabhängigen Namen für dieses Objekt zurück.

Ein Pfad, der nicht existiert, führt zu einem ENOENT-Fehler. error.path ist der absolute Dateipfad.

fs.realpath.native(path[, options], callback)#

Asynchrones realpath(3).

Der Callback erhält zwei Argumente (err, resolvedPath).

Es werden nur Pfade unterstützt, die in UTF-8-Strings konvertiert werden können.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den Pfad zu verwendende Zeichencodierung festlegt, die an den Callback übergeben wird. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Pfad als <Buffer>-Objekt übergeben.

Wenn Node.js unter Linux mit der musl-libc verknüpft ist, muss das procfs-Dateisystem unter /proc eingehängt sein, damit diese Funktion funktioniert. Glibc hat diese Einschränkung nicht.

fs.rename(oldPath, newPath, callback)#

Benennt die Datei bei oldPath asynchron in den als newPath bereitgestellten Pfadnamen um. Falls newPath bereits existiert, wird sie überschrieben. Wenn sich unter newPath ein Verzeichnis befindet, wird stattdessen ein Fehler ausgelöst. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe auch: rename(2).

import { rename } from 'node:fs';

rename('oldFile.txt', 'newFile.txt', (err) => {
  if (err) throw err;
  console.log('Rename complete!');
});

fs.rmdir(path[, options], callback)#

  • path <string> | <Buffer> | <URL>
  • options <Object> Es sind derzeit keine Optionen verfügbar. Es gab früher Optionen für recursive, maxBusyTries und emfileWait, diese wurden jedoch als veraltet markiert und entfernt. Das options-Argument wird aus Gründen der Abwärtskompatibilität weiterhin akzeptiert, aber nicht verwendet.
  • callback <Function>

Asynchrones rmdir(2). Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Die Verwendung von fs.rmdir() auf eine Datei (kein Verzeichnis) führt zu einem ENOENT-Fehler unter Windows und einem ENOTDIR-Fehler unter POSIX.

Um ein Verhalten ähnlich dem Unix-Befehl rm -rf zu erhalten, verwenden Sie fs.rm() mit den Optionen { recursive: true, force: true }.

fs.rm(path[, options], callback)#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> Wenn true, werden Ausnahmen ignoriert, wenn path nicht existiert. Standard: false.
    • maxRetries <integer> Wenn ein EBUSY-, EMFILE-, ENFILE-, ENOTEMPTY- oder EPERM-Fehler auftritt, wiederholt Node.js den Vorgang mit einem linearen Backoff-Warten von retryDelay Millisekunden länger bei jedem Versuch. Diese Option repräsentiert die Anzahl der Wiederholungen. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 0.
    • recursive <boolean> Wenn true, wird ein rekursives Entfernen durchgeführt. Im rekursiven Modus werden Vorgänge bei Fehlern wiederholt. Standard: false.
    • retryDelay <integer> Die Zeitspanne in Millisekunden, die zwischen Wiederholungsversuchen gewartet werden soll. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 100.
  • callback <Function>

Entfernt Dateien und Verzeichnisse asynchron (modelliert nach dem Standard-POSIX-Dienstprogramm rm). Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

fs.stat(path[, options], callback)#

Asynchrones stat(2). Der Callback erhält zwei Argumente (err, stats), wobei stats ein <fs.Stats>-Objekt ist.

Im Falle eines Fehlers ist der err.code einer der allgemeinen Systemfehler.

fs.stat() folgt symbolischen Links. Verwenden Sie fs.lstat(), um die Links selbst zu betrachten.

Es wird nicht empfohlen, fs.stat() zu verwenden, um die Existenz einer Datei zu prüfen, bevor Sie fs.open(), fs.readFile() oder fs.writeFile() aufrufen. Stattdessen sollte der Benutzercode die Datei direkt öffnen/lesen/schreiben und den Fehler behandeln, der ausgelöst wird, wenn die Datei nicht verfügbar ist.

Um zu prüfen, ob eine Datei existiert, ohne sie anschließend zu manipulieren, wird fs.access() empfohlen.

Zum Beispiel bei der folgenden Verzeichnisstruktur

- txtDir
-- file.txt
- app.js

Das nächste Programm wird die Stats der angegebenen Pfade prüfen

import { stat } from 'node:fs';

const pathsToCheck = ['./txtDir', './txtDir/file.txt'];

for (let i = 0; i < pathsToCheck.length; i++) {
  stat(pathsToCheck[i], (err, stats) => {
    console.log(stats.isDirectory());
    console.log(stats);
  });
}

Die resultierende Ausgabe wird in etwa so aussehen

true
Stats {
  dev: 16777220,
  mode: 16877,
  nlink: 3,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214262,
  size: 96,
  blocks: 0,
  atimeMs: 1561174653071.963,
  mtimeMs: 1561174614583.3518,
  ctimeMs: 1561174626623.5366,
  birthtimeMs: 1561174126937.2893,
  atime: 2019-06-22T03:37:33.072Z,
  mtime: 2019-06-22T03:36:54.583Z,
  ctime: 2019-06-22T03:37:06.624Z,
  birthtime: 2019-06-22T03:28:46.937Z
}
false
Stats {
  dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214074,
  size: 8,
  blocks: 8,
  atimeMs: 1561174616618.8555,
  mtimeMs: 1561174614584,
  ctimeMs: 1561174614583.8145,
  birthtimeMs: 1561174007710.7478,
  atime: 2019-06-22T03:36:56.619Z,
  mtime: 2019-06-22T03:36:54.584Z,
  ctime: 2019-06-22T03:36:54.584Z,
  birthtime: 2019-06-22T03:26:47.711Z
}

fs.statfs(path[, options], callback)#

Asynchrones statfs(2). Gibt Informationen über das eingehängte Dateisystem zurück, das path enthält. Der Callback erhält zwei Argumente (err, stats), wobei stats ein <fs.StatFs>-Objekt ist.

Im Falle eines Fehlers ist der err.code einer der allgemeinen Systemfehler.

fs.symlink(target, path[, type], callback)#

Erstellt den Link namens path, der auf target verweist. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

Siehe die POSIX symlink(2)-Dokumentation für weitere Details.

Das type-Argument ist nur unter Windows verfügbar und wird auf anderen Plattformen ignoriert. Es kann auf 'dir', 'file' oder 'junction' gesetzt werden. Wenn das type-Argument null ist, erkennt Node.js den Typ von target automatisch und verwendet 'file' oder 'dir'. Wenn das target nicht existiert, wird 'file' verwendet. Windows-Verknüpfungspunkte (Junctions) erfordern, dass der Zielpfad absolut ist. Bei Verwendung von 'junction' wird das target-Argument automatisch zu einem absoluten Pfad normalisiert. Verknüpfungspunkte auf NTFS-Volumes können nur auf Verzeichnisse zeigen.

Relative Ziele sind relativ zum übergeordneten Verzeichnis des Links.

import { symlink } from 'node:fs';

symlink('./mew', './mewtwo', callback);

Das obige Beispiel erstellt einen symbolischen Link mewtwo, der auf mew im selben Verzeichnis verweist.

$ tree .
.
├── mew
└── mewtwo -> ./mew

fs.truncate(path[, len], callback)#

Kürzt die Datei. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben. Ein Dateideskriptor kann auch als erstes Argument übergeben werden. In diesem Fall wird fs.ftruncate() aufgerufen.

import { truncate } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was truncated');
});
const { truncate } = require('node:fs');
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was truncated');
});

Die Übergabe eines Dateideskriptors ist veraltet und kann dazu führen, dass in Zukunft ein Fehler ausgelöst wird.

Siehe die POSIX truncate(2)-Dokumentation für weitere Details.

fs.unlink(path, callback)#

Entfernt asynchron eine Datei oder einen symbolischen Link. Es werden keine anderen Argumente als ein möglicher Fehler an den Abschluss-Callback übergeben.

import { unlink } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
unlink('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was deleted');
});

fs.unlink() funktioniert nicht bei einem Verzeichnis, egal ob leer oder nicht. Um ein Verzeichnis zu entfernen, verwenden Sie fs.rmdir().

Siehe die POSIX unlink(2)-Dokumentation für weitere Details.

fs.unwatchFile(filename[, listener])#

Stoppt die Beobachtung von Änderungen an filename. Wenn listener angegeben ist, wird nur dieser bestimmte Listener entfernt. Andernfalls werden alle Listener entfernt, wodurch die Beobachtung von filename effektiv gestoppt wird.

Der Aufruf von fs.unwatchFile() mit einem Dateinamen, der nicht beobachtet wird, ist eine No-Op, kein Fehler.

Die Verwendung von fs.watch() ist effizienter als fs.watchFile() und fs.unwatchFile(). fs.watch() sollte nach Möglichkeit anstelle von fs.watchFile() und fs.unwatchFile() verwendet werden.

fs.utimes(path, atime, mtime, callback)#

Ändert die Dateisystem-Zeitstempel des Objekts, auf das path verweist.

Die Argumente atime und mtime folgen diesen Regeln:

  • Werte können entweder Zahlen sein, die die Unix-Epochenzeit in Sekunden darstellen, Date-Objekte oder ein numerischer String wie '123456789.0'.
  • Wenn der Wert nicht in eine Zahl konvertiert werden kann oder NaN, Infinity oder -Infinity ist, wird ein Error ausgelöst.

fs.watch(filename[, options][, listener])#

  • filename <string> | <Buffer> | <URL>
  • options <string> | <Object>
    • persistent <boolean> Gibt an, ob der Prozess weiterlaufen soll, solange Dateien beobachtet werden. Standard: true.
    • recursive <boolean> Gibt an, ob alle Unterverzeichnisse beobachtet werden sollen oder nur das aktuelle Verzeichnis. Dies gilt, wenn ein Verzeichnis angegeben ist, und nur auf unterstützten Plattformen (siehe Caveats). Standard: false.
    • encoding <string> Gibt die Zeichencodierung an, die für den an den Listener übergebenen Dateinamen verwendet werden soll. Standard: 'utf8'.
    • signal <AbortSignal> ermöglicht das Schließen des Watchers mit einem AbortSignal.
    • ignore <string> | <RegExp> | <Function> | <Array> Zu ignorierende Muster. Strings sind Glob-Muster (unter Verwendung von minimatch), RegExp-Muster werden gegen den Dateinamen geprüft, und Funktionen erhalten den Dateinamen und geben true zurück, um ihn zu ignorieren. Standard: undefined.
  • listener <Function> | <undefined> Standard: undefined
  • Rückgabe: <fs.FSWatcher>

Überwachen Sie filename auf Änderungen, wobei filename entweder eine Datei oder ein Verzeichnis ist.

Das zweite Argument ist optional. Wenn options als Zeichenfolge angegeben wird, spezifiziert es das encoding. Andernfalls sollte options als Objekt übergeben werden.

Der Listener-Callback erhält zwei Argumente (eventType, filename). eventType ist entweder 'rename' oder 'change', und filename ist der Name der Datei, die das Ereignis ausgelöst hat.

Auf den meisten Plattformen wird 'rename' ausgegeben, wenn ein Dateiname im Verzeichnis erscheint oder verschwindet.

Der Listener-Callback ist an das 'change'-Ereignis gebunden, das von <fs.FSWatcher> ausgelöst wird; dies ist jedoch nicht dasselbe wie der Wert 'change' von eventType.

Wenn ein signal übergeben wird, schließt das Abbrechen des entsprechenden AbortControllers den zurückgegebenen <fs.FSWatcher>.

Vorbehalte#

Die fs.watch-API ist plattformübergreifend nicht zu 100 % konsistent und in einigen Situationen nicht verfügbar.

Unter Windows werden keine Ereignisse ausgegeben, wenn das überwachte Verzeichnis verschoben oder umbenannt wird. Ein EPERM-Fehler wird gemeldet, wenn das überwachte Verzeichnis gelöscht wird.

Die fs.watch-API bietet keinen Schutz gegen böswillige Aktionen auf dem Dateisystem. Unter Windows wird sie beispielsweise durch die Überwachung von Änderungen in einem Verzeichnis anstelle von spezifischen Dateien implementiert. Dies ermöglicht die Ersetzung einer Datei, wobei fs Änderungen an der neuen Datei mit demselben Dateinamen meldet.

Verfügbarkeit#

Dieses Feature hängt davon ab, dass das zugrunde liegende Betriebssystem eine Möglichkeit bietet, über Dateisystemänderungen benachrichtigt zu werden.

  • Auf Linux-Systemen verwendet dies inotify(7).
  • Auf BSD-Systemen verwendet dies kqueue(2).
  • Auf macOS verwendet dies kqueue(2) für Dateien und FSEvents für Verzeichnisse.
  • Auf SunOS-Systemen (einschließlich Solaris und SmartOS) verwendet dies event ports.
  • Auf Windows-Systemen hängt dieses Feature von ReadDirectoryChangesW ab.
  • Auf AIX-Systemen hängt dieses Feature von AHAFS ab, das aktiviert sein muss.
  • Auf IBM i-Systemen wird dieses Feature nicht unterstützt.

Wenn die zugrunde liegende Funktionalität aus irgendeinem Grund nicht verfügbar ist, kann fs.watch() nicht funktionieren und wirft möglicherweise eine Ausnahme. Beispielsweise kann das Überwachen von Dateien oder Verzeichnissen auf Netzwerkdateisystemen (NFS, SMB usw.) oder auf Host-Dateisystemen bei Verwendung von Virtualisierungssoftware wie Vagrant oder Docker unzuverlässig oder in einigen Fällen unmöglich sein.

Es ist weiterhin möglich, fs.watchFile() zu verwenden, das Stat-Polling nutzt, aber diese Methode ist langsamer und weniger zuverlässig.

Inodes#

Auf Linux- und macOS-Systemen löst fs.watch() den Pfad zu einem Inode auf und überwacht diesen Inode. Wenn der überwachte Pfad gelöscht und neu erstellt wird, erhält er einen neuen Inode. Der Watcher löst ein Ereignis für das Löschen aus, überwacht aber weiterhin den ursprünglichen Inode. Ereignisse für den neuen Inode werden nicht ausgegeben. Dies ist das erwartete Verhalten.

AIX-Dateien behalten für die gesamte Lebensdauer einer Datei denselben Inode bei. Das Speichern und Schließen einer überwachten Datei unter AIX führt zu zwei Benachrichtigungen (eine für das Hinzufügen von neuem Inhalt und eine für die Kürzung).

Filename-Argument#

Die Bereitstellung des filename-Arguments im Callback wird nur unter Linux, macOS, Windows und AIX unterstützt. Selbst auf unterstützten Plattformen ist nicht garantiert, dass filename immer bereitgestellt wird. Gehen Sie daher nicht davon aus, dass das filename-Argument im Callback immer vorhanden ist, und implementieren Sie eine Fallback-Logik, falls es null ist.

import { watch } from 'node:fs';
watch('somedir', (eventType, filename) => {
  console.log(`event type is: ${eventType}`);
  if (filename) {
    console.log(`filename provided: ${filename}`);
  } else {
    console.log('filename not provided');
  }
});

fs.watchFile(filename[, options], listener)#

Überwachen Sie filename auf Änderungen. Der listener-Callback wird jedes Mal aufgerufen, wenn auf die Datei zugegriffen wird.

Das options-Argument kann weggelassen werden. Falls bereitgestellt, sollte es ein Objekt sein. Das options-Objekt kann einen booleschen Wert namens persistent enthalten, der angibt, ob der Prozess so lange weiterlaufen soll, wie Dateien überwacht werden. Das options-Objekt kann eine interval-Eigenschaft angeben, die angibt, wie oft das Ziel in Millisekunden abgefragt werden soll.

Der listener erhält zwei Argumente: das aktuelle Stat-Objekt und das vorherige Stat-Objekt.

import { watchFile } from 'node:fs';

watchFile('message.text', (curr, prev) => {
  console.log(`the current mtime is: ${curr.mtime}`);
  console.log(`the previous mtime was: ${prev.mtime}`);
});

Diese Stat-Objekte sind Instanzen von fs.Stat. Wenn die bigint-Option true ist, werden die numerischen Werte in diesen Objekten als BigInts angegeben.

Um benachrichtigt zu werden, wenn die Datei geändert (nicht nur zugegriffen) wurde, ist es notwendig, curr.mtimeMs und prev.mtimeMs zu vergleichen.

Wenn eine fs.watchFile-Operation zu einem ENOENT-Fehler führt, wird der Listener einmal aufgerufen, wobei alle Felder auf null gesetzt sind (oder bei Datumswerten auf die Unix-Epoche). Wenn die Datei später erstellt wird, wird der Listener erneut mit den neuesten Stat-Objekten aufgerufen. Dies ist eine Änderung der Funktionalität seit v0.10.

Die Verwendung von fs.watch() ist effizienter als fs.watchFile und fs.unwatchFile. fs.watch sollte nach Möglichkeit anstelle von fs.watchFile und fs.unwatchFile verwendet werden.

Wenn eine Datei, die von fs.watchFile() überwacht wird, verschwindet und wieder auftaucht, ist der Inhalt von previous beim zweiten Callback-Ereignis (dem Wiederauftauchen der Datei) derselbe wie der Inhalt von previous beim ersten Callback-Ereignis (ihrem Verschwinden).

Dies geschieht, wenn

  • die Datei gelöscht und anschließend wiederhergestellt wird
  • die Datei umbenannt und dann ein zweites Mal in ihren ursprünglichen Namen zurückbenannt wird

fs.write(fd, buffer, offset[, length[, position]], callback)#

Schreiben Sie buffer in die durch fd angegebene Datei.

offset bestimmt den Teil des Buffers, der geschrieben werden soll, und length ist eine Ganzzahl, die die Anzahl der zu schreibenden Bytes angibt.

position bezieht sich auf den Offset vom Anfang der Datei, an dem diese Daten geschrieben werden sollen. Wenn typeof position !== 'number', werden die Daten an der aktuellen Position geschrieben. Siehe pwrite(2).

Der Callback erhält drei Argumente (err, bytesWritten, buffer), wobei bytesWritten angibt, wie viele Bytes aus dem buffer geschrieben wurden.

Wenn diese Methode als ihre util.promisify()-Version aufgerufen wird, gibt sie ein Promise für ein Object mit den Eigenschaften bytesWritten und buffer zurück.

Es ist unsicher, fs.write() mehrmals auf derselben Datei zu verwenden, ohne auf den Callback zu warten. Für dieses Szenario wird fs.createWriteStream() empfohlen.

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

fs.write(fd, buffer[, options], callback)#

Schreiben Sie buffer in die durch fd angegebene Datei.

Ähnlich wie die obige fs.write-Funktion nimmt diese Version ein optionales options-Objekt entgegen. Wenn kein options-Objekt angegeben ist, werden die obigen Standardwerte verwendet.

fs.write(fd, string[, position[, encoding]], callback)#

Schreiben Sie string in die durch fd angegebene Datei. Wenn string keine Zeichenfolge ist, wird eine Ausnahme ausgelöst.

position bezieht sich auf den Offset vom Anfang der Datei, an dem diese Daten geschrieben werden sollen. Wenn typeof position !== 'number', werden die Daten an der aktuellen Position geschrieben. Siehe pwrite(2).

encoding ist das erwartete Zeichenfolgen-Encoding.

Der Callback empfängt die Argumente (err, written, string), wobei written angibt, wie viele Bytes die übergebene Zeichenfolge zum Schreiben benötigte. Geschriebene Bytes sind nicht unbedingt dasselbe wie geschriebene Zeichen der Zeichenfolge. Siehe Buffer.byteLength.

Es ist unsicher, fs.write() mehrmals auf derselben Datei zu verwenden, ohne auf den Callback zu warten. Für dieses Szenario wird fs.createWriteStream() empfohlen.

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

Wenn unter Windows der Dateideskriptor mit der Konsole verbunden ist (z. B. fd == 1 oder stdout), wird eine Zeichenfolge, die Nicht-ASCII-Zeichen enthält, standardmäßig nicht korrekt wiedergegeben, unabhängig vom verwendeten Encoding. Es ist möglich, die Konsole für die korrekte Wiedergabe von UTF-8 zu konfigurieren, indem die aktive Codepage mit dem Befehl chcp 65001 geändert wird. Weitere Details finden Sie in der chcp-Dokumentation.

fs.writeFile(file, data[, options], callback)#

Wenn file ein Dateiname ist, werden Daten asynchron in die Datei geschrieben und die Datei ersetzt, falls sie bereits existiert. data kann eine Zeichenfolge oder ein Puffer sein.

Wenn file ein Dateideskriptor ist, ähnelt das Verhalten dem direkten Aufruf von fs.write() (was empfohlen wird). Siehe die Anmerkungen unten zur Verwendung eines Dateideskriptors.

Die Option encoding wird ignoriert, wenn data ein Puffer ist.

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

Wenn options ein String ist, dann spezifiziert er die Codierung

import { writeFile } from 'node:fs';

writeFile('message.txt', 'Hello Node.js', 'utf8', callback);

Es ist unsicher, fs.writeFile() mehrmals auf derselben Datei zu verwenden, ohne auf den Callback zu warten. Für dieses Szenario wird fs.createWriteStream() empfohlen.

Ähnlich wie fs.readFile ist fs.writeFile eine Komfortmethode, die intern mehrere write-Aufrufe ausführt, um den an sie übergebenen Puffer zu schreiben. Für leistungskritischen Code ziehen Sie fs.createWriteStream() in Betracht.

Es ist möglich, ein <AbortSignal> zu verwenden, um ein fs.writeFile() abzubrechen. Der Abbruch ist "Best Effort", und es ist wahrscheinlich, dass noch eine gewisse Menge an Daten geschrieben wird.

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const controller = new AbortController();
const { signal } = controller;
const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, { signal }, (err) => {
  // When a request is aborted - the callback is called with an AbortError
});
// When the request should be aborted
controller.abort();

Das Abbrechen einer laufenden Anfrage bricht nicht die einzelnen Betriebssystemanfragen ab, sondern das interne Puffern, das fs.writeFile durchführt.

Verwendung von fs.writeFile() mit Dateideskriptoren#

Wenn file ein Dateideskriptor ist, ist das Verhalten nahezu identisch mit dem direkten Aufruf von fs.write().

import { write } from 'node:fs';
import { Buffer } from 'node:buffer';

write(fd, Buffer.from(data, options.encoding), callback);

Der Unterschied zum direkten Aufruf von fs.write() besteht darin, dass fs.write() unter einigen ungewöhnlichen Bedingungen möglicherweise nur einen Teil des Puffers schreibt und wiederholt werden muss, um die restlichen Daten zu schreiben, während fs.writeFile() so lange wiederholt, bis die Daten vollständig geschrieben sind (oder ein Fehler auftritt).

Die Auswirkungen davon sind eine häufige Quelle der Verwirrung. Im Fall des Dateideskriptors wird die Datei nicht ersetzt! Die Daten werden nicht notwendigerweise an den Anfang der Datei geschrieben, und die ursprünglichen Daten der Datei können vor und/oder nach den neu geschriebenen Daten verbleiben.

Wenn zum Beispiel fs.writeFile() zweimal hintereinander aufgerufen wird, zuerst um die Zeichenfolge 'Hello' zu schreiben, dann um die Zeichenfolge ', World' zu schreiben, würde die Datei 'Hello, World' enthalten und könnte einige der ursprünglichen Daten der Datei enthalten (abhängig von der Größe der ursprünglichen Datei und der Position des Dateideskriptors). Wenn ein Dateiname anstelle eines Deskriptors verwendet worden wäre, wäre garantiert, dass die Datei nur ', World' enthält.

fs.writev(fd, buffers[, position], callback)#

Schreiben Sie ein Array von ArrayBufferViews in die durch fd angegebene Datei unter Verwendung von writev().

position ist der Offset vom Anfang der Datei, an dem diese Daten geschrieben werden sollen. Wenn typeof position !== 'number', werden die Daten an der aktuellen Position geschrieben.

Der Callback erhält drei Argumente: err, bytesWritten und buffers. bytesWritten ist die Anzahl der Bytes, die aus den buffers geschrieben wurden.

Wenn diese Methode als util.promisify()-Version verwendet wird, gibt sie ein Promise für ein Object mit bytesWritten- und buffers-Eigenschaften zurück.

Es ist unsicher, fs.writev() mehrmals auf derselben Datei zu verwenden, ohne auf den Callback zu warten. Verwenden Sie für dieses Szenario fs.createWriteStream().

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

Synchrone API#

Die synchronen APIs führen alle Operationen synchron aus und blockieren den Event-Loop, bis die Operation abgeschlossen oder fehlgeschlagen ist.

fs.accessSync(path[, mode])#

Testet synchron die Berechtigungen eines Benutzers für die durch path angegebene Datei oder das Verzeichnis. Das mode-Argument ist eine optionale Ganzzahl, die die durchzuführenden Zugriffsprüfungen angibt. mode sollte entweder den Wert fs.constants.F_OK oder eine Maske bestehend aus dem bitweisen ODER von fs.constants.R_OK, fs.constants.W_OK und fs.constants.X_OK haben (z. B. fs.constants.W_OK | fs.constants.R_OK). Überprüfen Sie Dateizugriffskonstanten für mögliche Werte von mode.

Wenn eine der Zugriffsprüfungen fehlschlägt, wird ein Error ausgelöst. Andernfalls gibt die Methode undefined zurück.

import { accessSync, constants } from 'node:fs';

try {
  accessSync('etc/passwd', constants.R_OK | constants.W_OK);
  console.log('can read/write');
} catch (err) {
  console.error('no access!');
}

fs.appendFileSync(path, data[, options])#

Hängen Sie Daten synchron an eine Datei an und erstellen Sie die Datei, falls sie noch nicht existiert. data kann eine Zeichenfolge oder ein <Buffer> sein.

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

import { appendFileSync } from 'node:fs';

try {
  appendFileSync('message.txt', 'data to append');
  console.log('The "data to append" was appended to file!');
} catch (err) {
  /* Handle the error */
}

Wenn options ein String ist, dann spezifiziert er die Codierung

import { appendFileSync } from 'node:fs';

appendFileSync('message.txt', 'data to append', 'utf8');

Der path kann als numerischer Dateideskriptor angegeben werden, der zum Anhängen geöffnet wurde (unter Verwendung von fs.open() oder fs.openSync()). Der Dateideskriptor wird nicht automatisch geschlossen.

import { openSync, closeSync, appendFileSync } from 'node:fs';

let fd;

try {
  fd = openSync('message.txt', 'a');
  appendFileSync(fd, 'data to append', 'utf8');
} catch (err) {
  /* Handle the error */
} finally {
  if (fd !== undefined)
    closeSync(fd);
}

fs.chmodSync(path, mode)#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.chmod().

Siehe die POSIX chmod(2)-Dokumentation für weitere Details.

fs.chownSync(path, uid, gid)#

Ändert synchron Eigentümer und Gruppe einer Datei. Gibt undefined zurück. Dies ist die synchrone Version von fs.chown().

Siehe die POSIX chown(2)-Dokumentation für weitere Details.

fs.closeSync(fd)#

Schließt den Dateideskriptor. Gibt undefined zurück.

Das Aufrufen von fs.closeSync() auf einem Dateideskriptor (fd), der derzeit über eine andere fs-Operation verwendet wird, kann zu undefiniertem Verhalten führen.

Siehe die POSIX close(2)-Dokumentation für weitere Details.

fs.copyFileSync(src, dest[, mode])#

Kopiert src synchron nach dest. Standardmäßig wird dest überschrieben, falls es bereits existiert. Gibt undefined zurück. Node.js gibt keine Garantien bezüglich der Atomarität des Kopiervorgangs. Wenn ein Fehler auftritt, nachdem die Zieldatei zum Schreiben geöffnet wurde, versucht Node.js, das Ziel zu entfernen.

mode ist eine optionale Ganzzahl, die das Verhalten des Kopiervorgangs angibt. Es ist möglich, eine Maske aus dem bitweisen ODER von zwei oder mehr Werten zu erstellen (z. B. fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE).

  • fs.constants.COPYFILE_EXCL: Die Kopieroperation schlägt fehl, wenn dest bereits existiert.
  • fs.constants.COPYFILE_FICLONE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, wird ein Fallback-Kopiermechanismus verwendet.
  • fs.constants.COPYFILE_FICLONE_FORCE: Die Kopieroperation versucht, einen Copy-on-Write-Reflink zu erstellen. Wenn die Plattform Copy-on-Write nicht unterstützt, schlägt die Operation fehl.
import { copyFileSync, constants } from 'node:fs';

// destination.txt will be created or overwritten by default.
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL);

fs.cpSync(src, dest[, options])#

  • src <string> | <URL> Quellpfad zum Kopieren.
  • dest <string> | <URL> Zielpfad zum Kopieren.
  • options <Object>
    • dereference <boolean> Dereferenzierung von symbolischen Links. Standard: false.
    • errorOnExist <boolean> wenn force false ist und das Ziel existiert, einen Fehler werfen. Standard: false.
    • filter <Function> Funktion zum Filtern kopierter Dateien/Verzeichnisse. Geben Sie true zurück, um das Element zu kopieren, und false, um es zu ignorieren. Wenn ein Verzeichnis ignoriert wird, wird auch dessen gesamter Inhalt übersprungen. Standard: undefined
      • src <string> Quellpfad zum Kopieren.
      • dest <string> Zielpfad zum Kopieren.
      • Rückgabe: <boolean> Jeder Nicht-Promise-Wert, der in einen boolean umgewandelt werden kann.
    • force <boolean> Bestehende Datei oder bestehendes Verzeichnis überschreiben. Die Kopieroperation ignoriert Fehler, wenn Sie dies auf false setzen und das Ziel existiert. Verwenden Sie die errorOnExist-Option, um dieses Verhalten zu ändern. Standard: true.
    • mode <integer> Modifikatoren für den Kopiervorgang. Standard: 0. Siehe das mode-Flag von fs.copyFileSync().
    • preserveTimestamps <boolean> Wenn true, werden Zeitstempel von src beibehalten. Standard: false.
    • recursive <boolean> Verzeichnisse rekursiv kopieren Standard: false
    • verbatimSymlinks <boolean> Wenn true, wird die Pfadauflösung für symbolische Links übersprungen. Standard: false

Kopiert synchron die gesamte Verzeichnisstruktur von src nach dest, einschließlich Unterverzeichnissen und Dateien.

Beim Kopieren eines Verzeichnisses in ein anderes Verzeichnis werden keine Globs unterstützt und das Verhalten entspricht cp dir1/ dir2/.

fs.existsSync(path)#

Gibt true zurück, wenn der Pfad existiert, andernfalls false.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.exists().

fs.exists() ist veraltet, fs.existsSync() hingegen nicht. Der callback-Parameter von fs.exists() akzeptiert Parameter, die nicht mit anderen Node.js-Callbacks konsistent sind. fs.existsSync() verwendet keinen Callback.

import { existsSync } from 'node:fs';

if (existsSync('/etc/passwd'))
  console.log('The path exists.');

fs.fchmodSync(fd, mode)#

Setzt die Berechtigungen für die Datei. Gibt undefined zurück.

Siehe die POSIX fchmod(2)-Dokumentation für weitere Details.

fs.fchownSync(fd, uid, gid)#

Setzt den Eigentümer der Datei. Gibt undefined zurück.

Siehe die POSIX fchown(2)-Dokumentation für weitere Details.

fs.fdatasyncSync(fd)#

Erzwingt, dass alle aktuell in der Warteschlange befindlichen I/O-Operationen, die mit der Datei verknüpft sind, den synchronisierten I/O-Abschlusszustand des Betriebssystems erreichen. Einzelheiten finden Sie in der POSIX-Dokumentation zu fdatasync(2). Gibt undefined zurück.

fs.fstatSync(fd[, options])#

Ruft die <fs.Stats> für den Dateideskriptor ab.

Siehe die POSIX fstat(2)-Dokumentation für weitere Details.

fs.fsyncSync(fd)#

Fordert an, dass alle Daten für den offenen Dateideskriptor auf das Speichergerät geflusht werden. Die spezifische Implementierung ist betriebssystem- und geräteabhängig. Weitere Informationen finden Sie in der POSIX-Dokumentation zu fsync(2). Gibt undefined zurück.

fs.ftruncateSync(fd[, len])#

Kürzt den Dateideskriptor. Gibt undefined zurück.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.ftruncate().

fs.futimesSync(fd, atime, mtime)#

Synchrone Version von fs.futimes(). Gibt undefined zurück.

fs.globSync(pattern[, options])#

  • pattern <string> | <string[]>
  • options <Object>
    • cwd <string> | <URL> Aktuelles Arbeitsverzeichnis. Standard: process.cwd()
    • exclude <Function> | <string[]> Funktion zum Filtern von Dateien/Verzeichnissen oder eine Liste von Glob-Mustern, die ausgeschlossen werden sollen. Wenn eine Funktion bereitgestellt wird, geben Sie true zurück, um das Element auszuschließen, und false, um es einzuschließen. Standard: undefined.
    • withFileTypes <boolean> true, wenn die Glob-Funktion Pfade als Dirents zurückgeben soll, sonst false. Standard: false.
  • Rückgabe: <string[]> Pfade von Dateien, die dem Muster entsprechen.
import { globSync } from 'node:fs';

console.log(globSync('**/*.js'));
const { globSync } = require('node:fs');

console.log(globSync('**/*.js'));

fs.lchmodSync(path, mode)#

Stabilität: 0 - Veraltet

Ändert die Berechtigungen für einen symbolischen Link. Gibt undefined zurück.

Diese Methode ist nur unter macOS implementiert.

Siehe die POSIX lchmod(2)-Dokumentation für weitere Details.

fs.lchownSync(path, uid, gid)#

Setzt den Eigentümer für den Pfad. Gibt undefined zurück.

Weitere Details finden Sie in der POSIX-Dokumentation zu lchown(2).

fs.lutimesSync(path, atime, mtime)#

Ändert die Dateisystem-Zeitstempel des symbolischen Links, auf den path verweist. Gibt undefined zurück oder löst eine Ausnahme aus, wenn Parameter falsch sind oder die Operation fehlschlägt. Dies ist die synchrone Version von fs.lutimes().

fs.linkSync(existingPath, newPath)#

Erstellt einen neuen Link von existingPath zu newPath. Weitere Einzelheiten finden Sie in der POSIX-Dokumentation zu link(2). Gibt undefined zurück.

fs.lstatSync(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • bigint <boolean> Ob die numerischen Werte im zurückgegebenen <fs.Stats>-Objekt BigInt sein sollen. Standard: false.
    • throwIfNoEntry <boolean> Gibt an, ob eine Ausnahme ausgelöst wird, wenn kein Dateisystemeintrag existiert, anstatt undefined zurückzugeben. Standard: true.
  • Rückgabe: <fs.Stats>

Ruft die <fs.Stats> für den symbolischen Link ab, auf den path verweist.

Siehe die POSIX lstat(2)-Dokumentation für weitere Details.

fs.mkdirSync(path[, options])#

Erstellt synchron ein Verzeichnis. Gibt undefined zurück oder, falls recursive auf true gesetzt ist, den ersten erstellten Verzeichnispfad. Dies ist die synchrone Version von fs.mkdir().

Siehe die POSIX mkdir(2)-Dokumentation für weitere Details.

fs.mkdtempSync(prefix[, options])#

Gibt den erstellten Verzeichnispfad zurück.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.mkdtemp().

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die zu verwendende Zeichenkodierung festlegt.

fs.mkdtempDisposableSync(prefix[, options])#

Gibt ein wegwerfbares Objekt zurück, dessen path-Eigenschaft den erstellten Verzeichnispfad enthält. Wenn das Objekt entsorgt wird, werden das Verzeichnis und dessen Inhalt entfernt, falls es noch existiert. Wenn das Verzeichnis nicht gelöscht werden kann, wirft die Entsorgung einen Fehler. Das Objekt verfügt über eine remove()-Methode, die dieselbe Aufgabe ausführt.

Detaillierte Informationen finden Sie in der Dokumentation von fs.mkdtemp().

Es gibt keine Callback-basierte Version dieser API, da sie für die Verwendung mit der using-Syntax konzipiert ist.

Das optionale options-Argument kann ein String sein, der eine Kodierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die zu verwendende Zeichenkodierung festlegt.

fs.opendirSync(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • encoding <string> | <null> Standard: 'utf8'
    • bufferSize <number> Anzahl der Verzeichniseinträge, die beim Lesen aus dem Verzeichnis intern gepuffert werden. Höhere Werte führen zu besserer Leistung, aber höherem Speicherverbrauch. Standard: 32
    • recursive <boolean> Standard: false
  • Rückgabe: <fs.Dir>

Öffnet synchron ein Verzeichnis. Siehe opendir(3).

Erstellt ein <fs.Dir>-Objekt, das alle weiteren Funktionen zum Lesen und Bereinigen des Verzeichnisses enthält.

Die encoding-Option legt die Kodierung für den path beim Öffnen des Verzeichnisses und für nachfolgende Lesevorgänge fest.

fs.openSync(path[, flags[, mode]])#

Gibt eine Ganzzahl zurück, die den Dateideskriptor repräsentiert.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.open().

fs.readdirSync(path[, options])#

Liest den Inhalt des Verzeichnisses.

Siehe die POSIX readdir(3)-Dokumentation für weitere Details.

Das optionale options-Argument kann eine Zeichenfolge sein, die ein Encoding spezifiziert, oder ein Objekt mit einer encoding-Eigenschaft, die das Zeichen-Encoding für die zurückgegebenen Dateinamen angibt. Wenn das encoding auf 'buffer' gesetzt ist, werden die zurückgegebenen Dateinamen als <Buffer>-Objekte übergeben.

Wenn options.withFileTypes auf true gesetzt ist, enthält das Ergebnis <fs.Dirent>-Objekte.

fs.readFileSync(path[, options])#

Gibt den Inhalt des path zurück.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.readFile().

Wenn die encoding-Option spezifiziert ist, gibt diese Funktion eine Zeichenfolge zurück. Andernfalls gibt sie einen Puffer zurück.

Ähnlich wie bei fs.readFile() ist das Verhalten von fs.readFileSync() plattformspezifisch, wenn der Pfad ein Verzeichnis ist.

import { readFileSync } from 'node:fs';

// macOS, Linux, and Windows
readFileSync('<directory>');
// => [Error: EISDIR: illegal operation on a directory, read <directory>]

//  FreeBSD
readFileSync('<directory>'); // => <data>

fs.readlinkSync(path[, options])#

Gibt den Zeichenfolgenwert des symbolischen Links zurück.

Siehe die POSIX readlink(2)-Dokumentation für weitere Details.

Das optionale options-Argument kann ein String sein, der eine Codierung angibt, oder ein Objekt mit einer encoding-Eigenschaft, die die für den zurückgegebenen Link-Pfad zu verwendende Zeichencodierung festlegt. Wenn die encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Link-Pfad als <Buffer>-Objekt übergeben.

fs.readSync(fd, buffer, offset, length[, position])#

Gibt die Anzahl der bytesRead zurück.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.read().

fs.readSync(fd, buffer[, options])#

Gibt die Anzahl der bytesRead zurück.

Ähnlich wie die obige fs.readSync-Funktion nimmt diese Version ein optionales options-Objekt entgegen. Wenn kein options-Objekt spezifiziert ist, werden die obigen Standardwerte verwendet.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.read().

fs.readvSync(fd, buffers[, position])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.readv().

fs.realpathSync(path[, options])#

Gibt den aufgelösten Pfadnamen zurück.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.realpath().

fs.realpathSync.native(path[, options])#

Synchrone realpath(3).

Es werden nur Pfade unterstützt, die in UTF-8-Strings konvertiert werden können.

Das optionale options-Argument kann eine Zeichenfolge sein, die ein Encoding spezifiziert, oder ein Objekt mit einer encoding-Eigenschaft, die das Zeichen-Encoding für den zurückgegebenen Pfad angibt. Wenn das encoding auf 'buffer' gesetzt ist, wird der zurückgegebene Pfad als ein <Buffer>-Objekt übergeben.

Wenn Node.js unter Linux mit der musl-libc verknüpft ist, muss das procfs-Dateisystem unter /proc eingehängt sein, damit diese Funktion funktioniert. Glibc hat diese Einschränkung nicht.

fs.renameSync(oldPath, newPath)#

Benennt die Datei von oldPath in newPath um. Gibt undefined zurück.

Weitere Details finden Sie in der POSIX-Dokumentation zu rename(2).

fs.rmdirSync(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object> Es sind derzeit keine Optionen verfügbar. Es gab früher Optionen für recursive, maxBusyTries und emfileWait, diese wurden jedoch als veraltet markiert und entfernt. Das options-Argument wird aus Gründen der Abwärtskompatibilität weiterhin akzeptiert, aber nicht verwendet.

Synchrone rmdir(2). Gibt undefined zurück.

Die Verwendung von fs.rmdirSync() auf eine Datei (nicht ein Verzeichnis) führt zu einem ENOENT-Fehler unter Windows und einem ENOTDIR-Fehler unter POSIX.

Um ein Verhalten ähnlich dem Unix-Befehl rm -rf zu erhalten, verwenden Sie fs.rmSync() mit den Optionen { recursive: true, force: true }.

fs.rmSync(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> Wenn true, werden Ausnahmen ignoriert, wenn path nicht existiert. Standard: false.
    • maxRetries <integer> Wenn ein EBUSY-, EMFILE-, ENFILE-, ENOTEMPTY- oder EPERM-Fehler auftritt, wiederholt Node.js den Vorgang mit einem linearen Backoff-Warten von retryDelay Millisekunden länger bei jedem Versuch. Diese Option repräsentiert die Anzahl der Wiederholungen. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 0.
    • recursive <boolean> Wenn true, wird ein rekursives Verzeichnis-Entfernen durchgeführt. Im rekursiven Modus werden Vorgänge bei Fehlern wiederholt. Standard: false.
    • retryDelay <integer> Die Zeitspanne in Millisekunden, die zwischen Wiederholungsversuchen gewartet werden soll. Diese Option wird ignoriert, wenn die Option recursive nicht true ist. Standard: 100.

Entfernt synchron Dateien und Verzeichnisse (modelliert nach dem Standard-POSIX-Dienstprogramm rm). Gibt undefined zurück.

fs.statSync(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object>
    • bigint <boolean> Ob die numerischen Werte im zurückgegebenen <fs.Stats>-Objekt BigInt sein sollen. Standard: false.
    • throwIfNoEntry <boolean> Gibt an, ob eine Ausnahme ausgelöst wird, wenn kein Dateisystemeintrag existiert, anstatt undefined zurückzugeben. Standard: true.
  • Rückgabe: <fs.Stats>

Ruft die <fs.Stats> für den Pfad ab.

fs.statfsSync(path[, options])#

Synchrone statfs(2). Gibt Informationen über das gemountete Dateisystem zurück, das path enthält.

Im Falle eines Fehlers ist der err.code einer der allgemeinen Systemfehler.

fs.symlinkSync(target, path[, type])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.symlink().

fs.truncateSync(path[, len])#

Kürzt die Datei. Gibt undefined zurück. Ein Dateideskriptor kann auch als erstes Argument übergeben werden. In diesem Fall wird fs.ftruncateSync() aufgerufen.

Die Übergabe eines Dateideskriptors ist veraltet und kann dazu führen, dass in Zukunft ein Fehler ausgelöst wird.

fs.unlinkSync(path)#

Synchrone unlink(2). Gibt undefined zurück.

fs.utimesSync(path, atime, mtime)#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.utimes().

fs.writeFileSync(file, data[, options])#

Die mode-Option betrifft nur die neu erstellte Datei. Siehe fs.open() für weitere Details.

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.writeFile().

fs.writeSync(fd, buffer, offset[, length[, position]])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.write(fd, buffer...).

fs.writeSync(fd, buffer[, options])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.write(fd, buffer...).

fs.writeSync(fd, string[, position[, encoding]])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.write(fd, string...).

fs.writevSync(fd, buffers[, position])#

Detaillierte Informationen finden Sie in der Dokumentation der asynchronen Version dieser API: fs.writev().

Allgemeine Objekte#

Die gemeinsamen Objekte werden von allen Varianten der Dateisystem-API (Promise, Callback und Synchron) gemeinsam genutzt.

Klasse: fs.Dir#

Eine Klasse, die einen Verzeichnisstream repräsentiert.

Erstellt durch fs.opendir(), fs.opendirSync() oder fsPromises.opendir().

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
}

Bei Verwendung des asynchronen Iterators wird das <fs.Dir>-Objekt nach dem Beenden des Iterators automatisch geschlossen.

dir.close()#

Schließt asynchron das zugrunde liegende Ressourcenhandle des Verzeichnisses. Nachfolgende Leseoperationen führen zu Fehlern.

Es wird ein Promise zurückgegeben, das erfüllt wird, nachdem die Ressource geschlossen wurde.

dir.close(callback)#

Schließt asynchron das zugrunde liegende Ressourcenhandle des Verzeichnisses. Nachfolgende Leseoperationen führen zu Fehlern.

Der callback wird aufgerufen, nachdem das Ressourcenhandle geschlossen wurde.

dir.closeSync()#

Schließt synchron das zugrunde liegende Ressourcenhandle des Verzeichnisses. Nachfolgende Leseoperationen führen zu Fehlern.

dir.path#

Der schreibgeschützte Pfad dieses Verzeichnisses, wie er an fs.opendir(), fs.opendirSync() oder fsPromises.opendir() übergeben wurde.

dir.read()#

Liest asynchron den nächsten Verzeichniseintrag via readdir(3) als ein <fs.Dirent>.

Es wird ein Promise zurückgegeben, das mit einem <fs.Dirent> erfüllt wird, oder null, wenn keine weiteren Verzeichniseinträge zu lesen sind.

Die von dieser Funktion zurückgegebenen Verzeichniseinträge haben keine bestimmte Reihenfolge, wie sie von den zugrunde liegenden Verzeichnismechanismen des Betriebssystems bereitgestellt werden. Einträge, die während der Iteration über das Verzeichnis hinzugefügt oder entfernt werden, sind möglicherweise nicht in den Iterationsergebnissen enthalten.

dir.read(callback)#

Liest asynchron den nächsten Verzeichniseintrag via readdir(3) als ein <fs.Dirent>.

Nachdem der Lesevorgang abgeschlossen ist, wird der callback mit einem <fs.Dirent> aufgerufen, oder null, wenn keine weiteren Verzeichniseinträge zu lesen sind.

Die von dieser Funktion zurückgegebenen Verzeichniseinträge haben keine bestimmte Reihenfolge, wie sie von den zugrunde liegenden Verzeichnismechanismen des Betriebssystems bereitgestellt werden. Einträge, die während der Iteration über das Verzeichnis hinzugefügt oder entfernt werden, sind möglicherweise nicht in den Iterationsergebnissen enthalten.

dir.readSync()#

Liest synchron den nächsten Verzeichniseintrag als ein <fs.Dirent>. Weitere Einzelheiten finden Sie in der POSIX-Dokumentation zu readdir(3).

Wenn keine weiteren Verzeichniseinträge zu lesen sind, wird null zurückgegeben.

Die von dieser Funktion zurückgegebenen Verzeichniseinträge haben keine bestimmte Reihenfolge, wie sie von den zugrunde liegenden Verzeichnismechanismen des Betriebssystems bereitgestellt werden. Einträge, die während der Iteration über das Verzeichnis hinzugefügt oder entfernt werden, sind möglicherweise nicht in den Iterationsergebnissen enthalten.

dir[Symbol.asyncIterator]()#

Iteriert asynchron über das Verzeichnis, bis alle Einträge gelesen wurden. Weitere Einzelheiten finden Sie in der POSIX-Dokumentation zu readdir(3).

Die vom AsyncIterator zurückgegebenen Einträge sind immer ein <fs.Dirent>. Der null-Fall von dir.read() wird intern behandelt.

Siehe <fs.Dir> für ein Beispiel.

Die von diesem Iterator zurückgegebenen Verzeichniseinträge haben keine bestimmte Reihenfolge, wie sie von den zugrunde liegenden Verzeichnismechanismen des Betriebssystems bereitgestellt werden. Einträge, die während der Iteration über das Verzeichnis hinzugefügt oder entfernt werden, sind möglicherweise nicht in den Iterationsergebnissen enthalten.

dir[Symbol.asyncDispose]()#

Ruft dir.close() auf, wenn das Verzeichnis-Handle offen ist, und gibt ein Promise zurück, das erfüllt wird, wenn die Entsorgung abgeschlossen ist.

dir[Symbol.dispose]()#

Ruft dir.closeSync() auf, wenn das Verzeichnis-Handle offen ist, und gibt undefined zurück.

Klasse: fs.Dirent#

Eine Repräsentation eines Verzeichniseintrags, der eine Datei oder ein Unterverzeichnis innerhalb des Verzeichnisses sein kann, wie er beim Lesen von einem <fs.Dir> zurückgegeben wird. Der Verzeichniseintrag ist eine Kombination aus Dateinamen- und Dateityp-Paaren.

Zusätzlich wird das resultierende Array mit <fs.Dirent>-Objekten anstelle von Zeichenfolgen oder <Buffer>s gefüllt, wenn fs.readdir() oder fs.readdirSync() mit der Option withFileTypes auf true gesetzt aufgerufen wird.

dirent.isBlockDevice()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt ein Blockgerät beschreibt.

dirent.isCharacterDevice()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt ein Zeichengerät beschreibt.

dirent.isDirectory()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt ein Dateisystemverzeichnis beschreibt.

dirent.isFIFO()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt eine First-in-First-out (FIFO)-Pipe beschreibt.

dirent.isFile()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt eine reguläre Datei beschreibt.

dirent.isSocket()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt einen Socket beschreibt.

dirent.isSymbolicLink()#

Gibt true zurück, wenn das <fs.Dirent>-Objekt einen symbolischen Link beschreibt.

dirent.name#

Der Dateiname, auf den sich dieses <fs.Dirent>-Objekt bezieht. Der Typ dieses Wertes wird durch das an fs.readdir() oder fs.readdirSync() übergebene options.encoding bestimmt.

dirent.parentPath#

Der Pfad zum übergeordneten Verzeichnis der Datei, auf die sich dieses <fs.Dirent>-Objekt bezieht.

Klasse: fs.FSWatcher#

Ein erfolgreicher Aufruf der fs.watch()-Methode gibt ein neues <fs.FSWatcher>-Objekt zurück.

Alle <fs.FSWatcher>-Objekte emittieren ein 'change'-Ereignis, wenn eine spezifisch überwachte Datei geändert wird.

Ereignis: 'change'#
  • eventType <string> Der Typ des aufgetretenen Änderungsereignisses
  • filename <string> | <Buffer> Der Dateiname, der geändert wurde (falls relevant/verfügbar)

Wird emittiert, wenn sich etwas in einem überwachten Verzeichnis oder einer Datei ändert. Weitere Details finden Sie unter fs.watch().

Das filename-Argument wird je nach Betriebssystemunterstützung möglicherweise nicht bereitgestellt. Wenn filename bereitgestellt wird, wird es als <Buffer> bereitgestellt, wenn fs.watch() mit seiner encoding-Option auf 'buffer' gesetzt aufgerufen wird, andernfalls ist filename eine UTF-8-Zeichenfolge.

import { watch } from 'node:fs';
// Example when handled through fs.watch() listener
watch('./tmp', { encoding: 'buffer' }, (eventType, filename) => {
  if (filename) {
    console.log(filename);
    // Prints: <Buffer ...>
  }
});
Ereignis: 'close'#

Wird emittiert, wenn der Watcher die Überwachung auf Änderungen stoppt. Das geschlossene <fs.FSWatcher>-Objekt ist im Ereignishandler nicht mehr verwendbar.

Ereignis: 'error'#

Wird emittiert, wenn während der Überwachung der Datei ein Fehler auftritt. Das fehlerhafte <fs.FSWatcher>-Objekt ist im Ereignishandler nicht mehr verwendbar.

watcher.close()#

Stoppen Sie die Überwachung auf Änderungen am angegebenen <fs.FSWatcher>. Sobald gestoppt, ist das <fs.FSWatcher>-Objekt nicht mehr verwendbar.

watcher.ref()#

Wenn aufgerufen, wird angefordert, dass der Node.js-Event-Loop nicht beendet wird, solange der <fs.FSWatcher> aktiv ist. Das mehrmalige Aufrufen von watcher.ref() hat keine Auswirkung.

Standardmäßig sind alle <fs.FSWatcher>-Objekte "ref'ed", wodurch es normalerweise nicht notwendig ist, watcher.ref() aufzurufen, es sei denn, watcher.unref() wurde zuvor aufgerufen.

watcher.unref()#

Wenn aufgerufen, erfordert das aktive <fs.FSWatcher>-Objekt nicht, dass der Node.js-Event-Loop aktiv bleibt. Wenn keine andere Aktivität den Event-Loop am Laufen hält, kann der Prozess beendet werden, bevor der Callback des <fs.FSWatcher>-Objekts aufgerufen wird. Das mehrmalige Aufrufen von watcher.unref() hat keine Auswirkung.

Klasse: fs.StatWatcher#

Ein erfolgreicher Aufruf der fs.watchFile()-Methode gibt ein neues <fs.StatWatcher>-Objekt zurück.

watcher.ref()#

Wenn aufgerufen, wird angefordert, dass der Node.js-Event-Loop nicht beendet wird, solange der <fs.StatWatcher> aktiv ist. Das mehrmalige Aufrufen von watcher.ref() hat keine Auswirkung.

Standardmäßig sind alle <fs.StatWatcher>-Objekte "ref'ed", wodurch es normalerweise nicht notwendig ist, watcher.ref() aufzurufen, es sei denn, watcher.unref() wurde zuvor aufgerufen.

watcher.unref()#

Wenn aufgerufen, erfordert das aktive <fs.StatWatcher>-Objekt nicht, dass der Node.js-Event-Loop aktiv bleibt. Wenn keine andere Aktivität den Event-Loop am Laufen hält, kann der Prozess beendet werden, bevor der Callback des <fs.StatWatcher>-Objekts aufgerufen wird. Das mehrmalige Aufrufen von watcher.unref() hat keine Auswirkung.

Klasse: fs.ReadStream#

Instanzen von <fs.ReadStream> können nicht direkt konstruiert werden. Sie werden erstellt und unter Verwendung der fs.createReadStream()-Funktion zurückgegeben.

Ereignis: 'close'#

Wird emittiert, wenn der zugrunde liegende Dateideskriptor des <fs.ReadStream> geschlossen wurde.

Ereignis: 'open'#

Wird emittiert, wenn der Dateideskriptor des <fs.ReadStream> geöffnet wurde.

Ereignis: 'ready'#

Wird emittiert, wenn der <fs.ReadStream> zur Verwendung bereit ist.

Wird unmittelbar nach 'open' ausgelöst.

readStream.bytesRead#

Die Anzahl der bisher gelesenen Bytes.

readStream.path#

Der Pfad zu der Datei, aus der der Stream liest, wie im ersten Argument zu fs.createReadStream() spezifiziert. Wenn path als Zeichenfolge übergeben wird, ist readStream.path eine Zeichenfolge. Wenn path als <Buffer> übergeben wird, ist readStream.path ein <Buffer>. Wenn fd spezifiziert ist, ist readStream.path undefined.

readStream.pending#

Diese Eigenschaft ist true, wenn die zugrunde liegende Datei noch nicht geöffnet wurde, d. h. bevor das 'ready'-Ereignis emittiert wird.

Klasse: fs.Stats#

Ein <fs.Stats>-Objekt liefert Informationen über eine Datei.

Objekte, die von fs.stat(), fs.lstat(), fs.fstat() und deren synchronen Gegenstücken zurückgegeben werden, sind von diesem Typ. Wenn bigint in den options, die an diese Methoden übergeben werden, true ist, sind die numerischen Werte bigint anstelle von number, und das Objekt enthält zusätzliche Eigenschaften mit Nanosekunden-Präzision, die mit Ns enden. Stat-Objekte sollten nicht direkt mit dem new-Schlüsselwort erstellt werden.

Stats {
  dev: 2114,
  ino: 48064969,
  mode: 33188,
  nlink: 1,
  uid: 85,
  gid: 100,
  rdev: 0,
  size: 527,
  blksize: 4096,
  blocks: 8,
  atimeMs: 1318289051000.1,
  mtimeMs: 1318289051000.1,
  ctimeMs: 1318289051000.1,
  birthtimeMs: 1318289051000.1,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT }

bigint-Version

BigIntStats {
  dev: 2114n,
  ino: 48064969n,
  mode: 33188n,
  nlink: 1n,
  uid: 85n,
  gid: 100n,
  rdev: 0n,
  size: 527n,
  blksize: 4096n,
  blocks: 8n,
  atimeMs: 1318289051000n,
  mtimeMs: 1318289051000n,
  ctimeMs: 1318289051000n,
  birthtimeMs: 1318289051000n,
  atimeNs: 1318289051000000000n,
  mtimeNs: 1318289051000000000n,
  ctimeNs: 1318289051000000000n,
  birthtimeNs: 1318289051000000000n,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT }
stats.isBlockDevice()#

Gibt true zurück, wenn das <fs.Stats>-Objekt ein Blockgerät beschreibt.

stats.isCharacterDevice()#

Gibt true zurück, wenn das <fs.Stats>-Objekt ein Zeichengerät beschreibt.

stats.isDirectory()#

Gibt true zurück, wenn das <fs.Stats>-Objekt ein Dateisystemverzeichnis beschreibt.

Wenn das <fs.Stats>-Objekt durch den Aufruf von fs.lstat() auf einen symbolischen Link erhalten wurde, der in ein Verzeichnis aufgelöst wird, gibt diese Methode false zurück. Dies liegt daran, dass fs.lstat() Informationen über den symbolischen Link selbst zurückgibt und nicht über den Pfad, in den er aufgelöst wird.

stats.isFIFO()#

Gibt true zurück, wenn das <fs.Stats>-Objekt eine First-in-First-out (FIFO)-Pipe beschreibt.

stats.isFile()#

Gibt true zurück, wenn das <fs.Stats>-Objekt eine reguläre Datei beschreibt.

stats.isSocket()#

Gibt true zurück, wenn das <fs.Stats>-Objekt einen Socket beschreibt.

stats.isSymbolicLink()#

Gibt true zurück, wenn das <fs.Stats>-Objekt einen symbolischen Link beschreibt.

Diese Methode ist nur gültig bei Verwendung von fs.lstat().

stats.dev#

Der numerische Identifikator des Geräts, das die Datei enthält.

stats.ino#

Die Dateisystem-spezifische "Inode"-Nummer für die Datei.

stats.mode#

Ein Bitfeld, das den Dateityp und -modus beschreibt.

stats.nlink#

Die Anzahl der Hard-Links, die für die Datei existieren.

stats.uid#

Der numerische Benutzeridentifikator des Benutzers, der die Datei besitzt (POSIX).

stats.gid#

Der numerische Gruppenidentifikator der Gruppe, die die Datei besitzt (POSIX).

stats.rdev#

Ein numerischer Geräteidentifikator, wenn die Datei ein Gerät repräsentiert.

stats.size#

Die Größe der Datei in Bytes.

Wenn das zugrunde liegende Dateisystem das Abrufen der Dateigröße nicht unterstützt, ist dies 0.

stats.blksize#

Die Dateisystem-Blockgröße für I/O-Operationen.

stats.blocks#

Die Anzahl der für diese Datei reservierten Blöcke.

stats.atimeMs#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem auf diese Datei zugegriffen wurde, ausgedrückt in Millisekunden seit der POSIX-Epoche.

stats.mtimeMs#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem diese Datei geändert wurde, ausgedrückt in Millisekunden seit der POSIX-Epoche.

stats.ctimeMs#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem der Dateistatus geändert wurde, ausgedrückt in Millisekunden seit der POSIX-Epoche.

stats.birthtimeMs#

Der Zeitstempel, der den Erstellungszeitpunkt dieser Datei angibt, ausgedrückt in Millisekunden seit der POSIX-Epoche.

stats.atimeNs#

Nur vorhanden, wenn bigint: true an die Methode übergeben wird, die das Objekt generiert. Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem auf diese Datei zugegriffen wurde, ausgedrückt in Nanosekunden seit der POSIX-Epoche.

stats.mtimeNs#

Nur vorhanden, wenn bigint: true an die Methode übergeben wird, die das Objekt generiert. Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem diese Datei geändert wurde, ausgedrückt in Nanosekunden seit der POSIX-Epoche.

stats.ctimeNs#

Nur vorhanden, wenn bigint: true an die Methode übergeben wird, die das Objekt generiert. Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem der Dateistatus geändert wurde, ausgedrückt in Nanosekunden seit der POSIX-Epoche.

stats.birthtimeNs#

Nur vorhanden, wenn bigint: true an die Methode übergeben wird, die das Objekt generiert. Der Zeitstempel, der den Erstellungszeitpunkt dieser Datei angibt, ausgedrückt in Nanosekunden seit der POSIX-Epoche.

stats.atime#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem auf diese Datei zugegriffen wurde.

stats.mtime#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem diese Datei geändert wurde.

stats.ctime#

Der Zeitstempel, der den letzten Zeitpunkt angibt, zu dem der Dateistatus geändert wurde.

stats.birthtime#

Der Zeitstempel, der den Erstellungszeitpunkt dieser Datei angibt.

Stat-Zeitwerte#

Die Eigenschaften atimeMs, mtimeMs, ctimeMs und birthtimeMs sind numerische Werte, die die entsprechenden Zeiten in Millisekunden enthalten. Ihre Präzision ist plattformspezifisch. Wenn bigint: true an die Methode übergeben wird, die das Objekt generiert, sind die Eigenschaften bigints, andernfalls sind sie Zahlen.

Die Eigenschaften atimeNs, mtimeNs, ctimeNs und birthtimeNs sind bigints, die die entsprechenden Zeiten in Nanosekunden enthalten. Sie sind nur vorhanden, wenn bigint: true an die Methode übergeben wird, die das Objekt generiert. Ihre Präzision ist plattformspezifisch.

atime, mtime, ctime und birthtime sind alternative Repräsentationen der verschiedenen Zeiten als Date-Objekte. Die Date- und Zahlenwerte sind nicht miteinander verbunden. Das Zuweisen eines neuen Zahlenwerts oder das Mutieren des Date-Werts wird nicht in der entsprechenden alternativen Repräsentation reflektiert.

Die Zeiten im Stat-Objekt haben die folgenden Semantiken:

  • atime "Access Time": Zeitpunkt, an dem auf Dateidaten zuletzt zugegriffen wurde. Geändert durch die Systemaufrufe mknod(2), utimes(2) und read(2).
  • mtime "Modified Time": Zeitpunkt der letzten Änderung der Dateidaten. Wird durch die Systemaufrufe mknod(2), utimes(2) und write(2) geändert.
  • ctime "Change Time": Zeitpunkt der letzten Statusänderung der Datei (Änderung der Inode-Daten). Wird durch die Systemaufrufe chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2), read(2) und write(2) geändert.
  • birthtime "Birth Time": Zeitpunkt der Dateierstellung. Wird einmalig beim Erstellen der Datei gesetzt. Auf Dateisystemen, auf denen die "Birth Time" nicht verfügbar ist, kann dieses Feld stattdessen ctime oder 1970-01-01T00:00Z (d. h. Unix-Epochen-Zeitstempel 0) enthalten. Dieser Wert kann in diesem Fall größer als atime oder mtime sein. Auf Darwin und anderen FreeBSD-Varianten wird er auch dann gesetzt, wenn die atime mithilfe des Systemaufrufs utimes(2) explizit auf einen früheren Wert als die aktuelle birthtime gesetzt wird.

Vor Node.js 0.12 enthielt ctime auf Windows-Systemen die birthtime. Seit 0.12 ist ctime nicht die "Erstellungszeit", und auf Unix-Systemen war sie das nie.

Klasse: fs.StatFs#

Bietet Informationen über ein eingehängtes Dateisystem.

Objekte, die von fs.statfs() und seinem synchronen Gegenstück zurückgegeben werden, sind von diesem Typ. Wenn bigint in den an diese Methoden übergebenen options auf true gesetzt ist, werden die numerischen Werte als bigint statt als number zurückgegeben.

StatFs {
  type: 1397114950,
  bsize: 4096,
  blocks: 121938943,
  bfree: 61058895,
  bavail: 61058895,
  files: 999,
  ffree: 1000000
}

bigint-Version

StatFs {
  type: 1397114950n,
  bsize: 4096n,
  blocks: 121938943n,
  bfree: 61058895n,
  bavail: 61058895n,
  files: 999n,
  ffree: 1000000n
}
statfs.bavail#

Für nicht privilegierte Benutzer verfügbare freie Blöcke.

statfs.bfree#

Freie Blöcke im Dateisystem.

statfs.blocks#

Gesamtzahl der Datenblöcke im Dateisystem.

statfs.bsize#

Optimale Blockgröße für Übertragungen.

statfs.ffree#

Freie Dateiknoten im Dateisystem.

statfs.files#

Gesamtzahl der Dateiknoten im Dateisystem.

statfs.type#

Typ des Dateisystems.

Klasse: fs.Utf8Stream#

Stabilität: 1 - Experimentell

Ein optimierter UTF-8-Stream-Writer, der es ermöglicht, die gesamte interne Pufferung bei Bedarf zu leeren (flushing). Er verarbeitet EAGAIN-Fehler korrekt und ermöglicht Anpassungen, z. B. durch Verwerfen von Inhalten, wenn die Festplatte ausgelastet ist.

Ereignis: 'close'#

Das 'close'-Ereignis wird ausgegeben, wenn der Stream vollständig geschlossen ist.

Ereignis: 'drain'#

Das 'drain'-Ereignis wird ausgegeben, wenn der interne Puffer ausreichend geleert wurde, um weitere Schreibvorgänge zu ermöglichen.

Ereignis: 'drop'#

Das 'drop'-Ereignis wird ausgegeben, wenn die maximale Länge erreicht ist und Daten nicht geschrieben werden. Die verworfenen Daten werden als erstes Argument an den Ereignishandler übergeben.

Ereignis: 'error'#

Das 'error'-Ereignis wird ausgegeben, wenn ein Fehler auftritt.

Ereignis: 'finish'#

Das 'finish'-Ereignis wird ausgegeben, wenn der Stream beendet wurde und alle Daten in die zugrunde liegende Datei geschrieben wurden.

Ereignis: 'ready'#

Das 'ready'-Ereignis wird ausgegeben, wenn der Stream bereit ist, Schreibvorgänge entgegenzunehmen.

Ereignis: 'write'#

Das 'write'-Ereignis wird ausgegeben, wenn ein Schreibvorgang abgeschlossen wurde. Die Anzahl der geschriebenen Bytes wird als erstes Argument an den Ereignishandler übergeben.

new fs.Utf8Stream([options])#
  • options <Object>
    • append: <boolean> Hängt Schreibvorgänge an die Zieldatei an, anstatt sie zu überschreiben (truncate). Standard: true.
    • contentMode: <string> Welche Art von Daten an die Schreibfunktion gesendet werden können; unterstützte Werte sind 'utf8' oder 'buffer'. Standard: 'utf8'.
    • dest: <string> Ein Pfad zu einer Datei, in die geschrieben werden soll (Modus gesteuert durch die append-Option).
    • fd: <number> Ein Dateideskriptor, wie er von fs.open() oder fs.openSync() zurückgegeben wird.
    • fs: <Object> Ein Objekt, das dieselbe API wie das fs-Modul hat, nützlich für Mocking, Tests oder das Anpassen des Stream-Verhaltens.
    • fsync: <boolean> Führt nach jedem abgeschlossenen Schreibvorgang ein fs.fsyncSync() aus.
    • maxLength: <number> Die maximale Länge des internen Puffers. Wenn ein Schreibvorgang dazu führen würde, dass der Puffer maxLength überschreitet, werden die geschriebenen Daten verworfen und ein Drop-Ereignis mit den verworfenen Daten ausgegeben.
    • maxWrite: <number> Die maximale Anzahl von Bytes, die geschrieben werden können; Standard: 16384
    • minLength: <number> Die Mindestlänge des internen Puffers, der gefüllt sein muss, bevor ein Flush erfolgt.
    • mkdir: <boolean> Stellt sicher, dass das Verzeichnis für die dest-Datei existiert, wenn true. Standard: false.
    • mode: <number> | <string> Gibt den Modus der erstellten Datei an (siehe fs.open()).
    • periodicFlush: <number> Ruft das Flush alle periodicFlush Millisekunden auf.
    • retryEAGAIN <Function> Eine Funktion, die aufgerufen wird, wenn write(), writeSync() oder flushSync() auf einen EAGAIN- oder EBUSY-Fehler stößt. Wenn der Rückgabewert true ist, wird der Vorgang wiederholt, andernfalls wird der Fehler weitergereicht. err ist der Fehler, der den Aufruf dieser Funktion verursacht hat, writeBufferLen ist die Länge des geschriebenen Puffers und remainingBufferLen ist die Länge des verbleibenden Puffers, den der Stream nicht zu schreiben versucht hat.
    • sync: <boolean> Führt Schreibvorgänge synchron aus.
utf8Stream.append#
  • <boolean> Gibt an, ob der Stream Daten an die Datei anhängt oder sie überschreibt.
utf8Stream.contentMode#
  • <string> Die Art der Daten, die in den Stream geschrieben werden können. Unterstützte Werte sind 'utf8' oder 'buffer'. Standard: 'utf8'.
utf8Stream.destroy()#

Schließt den Stream sofort, ohne den internen Puffer zu leeren.

utf8Stream.end()#

Schließt den Stream ordnungsgemäß und leert den internen Puffer vor dem Schließen.

utf8Stream.fd#
  • <number> Der Dateideskriptor, in den geschrieben wird.
utf8Stream.file#
  • <string> Die Datei, in die geschrieben wird.
utf8Stream.flush(callback)#

Schreibt den aktuellen Puffer in die Datei, falls kein Schreibvorgang im Gange war. Tut nichts, wenn minLength null ist oder bereits geschrieben wird.

utf8Stream.flushSync()#

Leert die gepufferten Daten synchron. Dies ist ein aufwendiger Vorgang.

utf8Stream.fsync#
  • <boolean> Gibt an, ob der Stream nach jedem Schreibvorgang ein fs.fsyncSync() ausführt.
utf8Stream.maxLength#
  • <number> Die maximale Länge des internen Puffers. Wenn ein Schreibvorgang dazu führen würde, dass der Puffer maxLength überschreitet, werden die geschriebenen Daten verworfen und ein Drop-Ereignis mit den verworfenen Daten ausgegeben.
utf8Stream.minLength#
  • <number> Die Mindestlänge des internen Puffers, der gefüllt sein muss, bevor ein Flush erfolgt.
utf8Stream.mkdir#
  • <boolean> Gibt an, ob der Stream sicherstellen soll, dass das Verzeichnis für die dest-Datei existiert. Wenn true, erstellt er das Verzeichnis, falls es nicht existiert. Standard: false.
utf8Stream.mode#
utf8Stream.periodicFlush#
  • <number> Die Anzahl der Millisekunden zwischen den Flushes. Wenn auf 0 gesetzt, werden keine periodischen Flushes durchgeführt.
utf8Stream.reopen(file)#
  • file: <string> | <Buffer> | <URL> Ein Pfad zu einer Datei, in die geschrieben werden soll (Modus gesteuert durch die append-Option).

Öffnet die Datei an Ort und Stelle neu, nützlich für die Log-Rotation.

utf8Stream.sync#
  • <boolean> Gibt an, ob der Stream synchron oder asynchron schreibt.
utf8Stream.write(data)#

Wenn beim Erstellen des Streams options.contentMode auf 'utf8' gesetzt ist, muss das Argument data ein String sein. Wenn der contentMode auf 'buffer' gesetzt ist, muss das Argument data ein <Buffer> sein.

utf8Stream.writing#
  • <boolean> Gibt an, ob der Stream gerade Daten in die Datei schreibt.
utf8Stream[Symbol.dispose]()#

Ruft utf8Stream.destroy() auf.

Klasse: fs.WriteStream#

Instanzen von <fs.WriteStream> können nicht direkt erstellt werden. Sie werden mit der Funktion fs.createWriteStream() erstellt und zurückgegeben.

Ereignis: 'close'#

Wird ausgegeben, wenn der zugrunde liegende Dateideskriptor des <fs.WriteStream> geschlossen wurde.

Ereignis: 'open'#

Wird ausgegeben, wenn die Datei des <fs.WriteStream> geöffnet wird.

Ereignis: 'ready'#

Wird ausgegeben, wenn der <fs.WriteStream> bereit zur Verwendung ist.

Wird unmittelbar nach 'open' ausgelöst.

writeStream.bytesWritten#

Die Anzahl der bisher geschriebenen Bytes. Enthält keine Daten, die noch für das Schreiben in der Warteschlange stehen.

writeStream.close([callback])#

Schließt den writeStream. Akzeptiert optional einen Callback, der ausgeführt wird, sobald der writeStream geschlossen ist.

writeStream.path#

Der Pfad zu der Datei, in die der Stream schreibt, wie im ersten Argument von fs.createWriteStream() angegeben. Wenn path als String übergeben wird, ist writeStream.path ein String. Wenn path als <Buffer> übergeben wird, ist writeStream.path ein <Buffer>.

writeStream.pending#

Diese Eigenschaft ist true, wenn die zugrunde liegende Datei noch nicht geöffnet wurde, d. h. bevor das 'ready'-Ereignis emittiert wird.

fs.constants#

Gibt ein Objekt zurück, das häufig verwendete Konstanten für Dateisystemoperationen enthält.

FS-Konstanten#

Die folgenden Konstanten werden von fs.constants und fsPromises.constants exportiert.

Nicht jede Konstante ist auf jedem Betriebssystem verfügbar; dies ist besonders für Windows wichtig, wo viele der POSIX-spezifischen Definitionen nicht vorhanden sind. Für portierbare Anwendungen wird empfohlen, vor der Verwendung auf deren Vorhandensein zu prüfen.

Um mehr als eine Konstante zu verwenden, verwenden Sie den bitweisen OR-Operator |.

Beispiel

import { open, constants } from 'node:fs';

const {
  O_RDWR,
  O_CREAT,
  O_EXCL,
} = constants;

open('/path/to/my/file', O_RDWR | O_CREAT | O_EXCL, (err, fd) => {
  // ...
});
Dateizugriffskonstanten#

Die folgenden Konstanten sind für die Verwendung als mode-Parameter vorgesehen, der an fsPromises.access(), fs.access() und fs.accessSync() übergeben wird.

Konstante Beschreibung
F_OK Flag, das anzeigt, dass die Datei für den aufrufenden Prozess sichtbar ist. Dies ist nützlich, um festzustellen, ob eine Datei existiert, sagt aber nichts über rwx-Berechtigungen aus. Standard, wenn kein Modus angegeben ist.
R_OK Flag, das anzeigt, dass die Datei vom aufrufenden Prozess gelesen werden kann.
W_OK Flag, das anzeigt, dass die Datei vom aufrufenden Prozess beschrieben werden kann.
X_OK Flag, das anzeigt, dass die Datei vom aufrufenden Prozess ausgeführt werden kann. Dies hat unter Windows keine Auswirkung (verhält sich wie fs.constants.F_OK).

Die Definitionen sind auch unter Windows verfügbar.

Dateikopie-Konstanten#

Die folgenden Konstanten sind für die Verwendung mit fs.copyFile() vorgesehen.

Konstante Beschreibung
COPYFILE_EXCL Falls vorhanden, schlägt der Kopiervorgang mit einem Fehler fehl, wenn der Zielpfad bereits existiert.
COPYFILE_FICLONE Falls vorhanden, versucht der Kopiervorgang, einen Copy-on-Write-Reflink zu erstellen. Wenn die zugrunde liegende Plattform Copy-on-Write nicht unterstützt, wird ein Fallback-Kopiermechanismus verwendet.
COPYFILE_FICLONE_FORCE Falls vorhanden, versucht der Kopiervorgang, einen Copy-on-Write-Reflink zu erstellen. Wenn die zugrunde liegende Plattform Copy-on-Write nicht unterstützt, schlägt der Vorgang mit einem Fehler fehl.

Die Definitionen sind auch unter Windows verfügbar.

Datei-Öffnungskonstanten#

Die folgenden Konstanten sind für die Verwendung mit fs.open() vorgesehen.

Konstante Beschreibung
O_RDONLY Flag, das anzeigt, eine Datei für den schreibgeschützten Zugriff zu öffnen.
O_WRONLY Flag, das anzeigt, eine Datei nur für den Schreibzugriff zu öffnen.
O_RDWR Flag, das anzeigt, eine Datei für Lese- und Schreibzugriff zu öffnen.
O_CREAT Flag, das anzeigt, die Datei zu erstellen, falls sie noch nicht existiert.
O_EXCL Flag, das anzeigt, dass das Öffnen einer Datei fehlschlagen sollte, wenn das O_CREAT-Flag gesetzt ist und die Datei bereits existiert.
O_NOCTTY Flag, das anzeigt, dass das Öffnen nicht dazu führen soll, dass dieses Terminal zum steuernden Terminal für den Prozess wird (falls der Prozess noch keines hat), wenn der Pfad ein Terminalgerät identifiziert.
O_TRUNC Flag, das anzeigt, dass die Länge der Datei auf Null gekürzt werden soll, wenn die Datei existiert, eine reguläre Datei ist und erfolgreich für den Schreibzugriff geöffnet wird.
O_APPEND Flag, das anzeigt, dass Daten an das Ende der Datei angehängt werden.
O_DIRECTORY Flag, das anzeigt, dass das Öffnen fehlschlagen sollte, wenn der Pfad kein Verzeichnis ist.
O_NOATIME Flag, das anzeigt, dass Lesezugriffe auf das Dateisystem nicht mehr zu einer Aktualisierung der mit der Datei verbundenen atime-Informationen führen. Dieses Flag ist nur auf Linux-Betriebssystemen verfügbar.
O_NOFOLLOW Flag, das anzeigt, dass das Öffnen fehlschlagen sollte, wenn der Pfad ein symbolischer Link ist.
O_SYNC Flag, das anzeigt, dass die Datei für synchronisierte E/A geöffnet wird, wobei Schreibvorgänge auf die Integrität der Datei warten.
O_DSYNC Flag, das anzeigt, dass die Datei für synchronisierte E/A geöffnet wird, wobei Schreibvorgänge auf die Datenintegrität warten.
O_SYMLINK Flag, das anzeigt, den symbolischen Link selbst zu öffnen, anstatt die Ressource, auf die er zeigt.
O_DIRECT Wenn gesetzt, wird versucht, Caching-Effekte der Datei-E/A zu minimieren.
O_NONBLOCK Flag, das anzeigt, die Datei nach Möglichkeit im nicht-blockierenden Modus zu öffnen.
UV_FS_O_FILEMAP Wenn gesetzt, wird eine Speicher-Datei-Abbildung verwendet, um auf die Datei zuzugreifen. Dieses Flag ist nur auf Windows-Betriebssystemen verfügbar. Auf anderen Betriebssystemen wird dieses Flag ignoriert.

Unter Windows sind nur O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_TRUNC, O_WRONLY und UV_FS_O_FILEMAP verfügbar.

Dateityp-Konstanten#

Die folgenden Konstanten sind für die Verwendung mit der mode-Eigenschaft des <fs.Stats>-Objekts zur Bestimmung des Dateityps vorgesehen.

Konstante Beschreibung
S_IFMT Bitmaske, die zum Extrahieren des Dateitypcodes verwendet wird.
S_IFREG Dateityp-Konstante für eine reguläre Datei.
S_IFDIR Dateityp-Konstante für ein Verzeichnis.
S_IFCHR Dateityp-Konstante für eine zeichenorientierte Gerätedatei.
S_IFBLK Dateityp-Konstante für eine blockorientierte Gerätedatei.
S_IFIFO Dateityp-Konstante für ein FIFO/Pipe.
S_IFLNK Dateityp-Konstante für einen symbolischen Link.
S_IFSOCK Dateityp-Konstante für einen Socket.

Unter Windows sind nur S_IFCHR, S_IFDIR, S_IFLNK, S_IFMT und S_IFREG verfügbar.

Dateimodus-Konstanten#

Die folgenden Konstanten sind für die Verwendung mit der mode-Eigenschaft des <fs.Stats>-Objekts zur Bestimmung der Zugriffsberechtigungen einer Datei vorgesehen.

Konstante Beschreibung
S_IRWXU Dateimodus, der anzeigt, dass der Eigentümer lesen, schreiben und ausführen kann.
S_IRUSR Dateimodus, der anzeigt, dass der Eigentümer lesen kann.
S_IWUSR Dateimodus, der anzeigt, dass der Eigentümer schreiben kann.
S_IXUSR Dateimodus, der anzeigt, dass der Eigentümer ausführen kann.
S_IRWXG Dateimodus, der anzeigt, dass die Gruppe lesen, schreiben und ausführen kann.
S_IRGRP Dateimodus, der anzeigt, dass die Gruppe lesen kann.
S_IWGRP Dateimodus, der anzeigt, dass die Gruppe schreiben kann.
S_IXGRP Dateimodus, der anzeigt, dass die Gruppe ausführen kann.
S_IRWXO Dateimodus, der anzeigt, dass Andere lesen, schreiben und ausführen können.
S_IROTH Dateimodus, der anzeigt, dass Andere lesen können.
S_IWOTH Dateimodus, der anzeigt, dass Andere schreiben können.
S_IXOTH Dateimodus, der anzeigt, dass Andere ausführen können.

Unter Windows sind nur S_IRUSR und S_IWUSR verfügbar.

Hinweise#

Reihenfolge von Callback- und Promise-basierten Operationen#

Da sie vom zugrunde liegenden Thread-Pool asynchron ausgeführt werden, gibt es keine garantierte Reihenfolge bei der Verwendung von Callback- oder Promise-basierten Methoden.

Zum Beispiel ist Folgendes fehleranfällig, da die fs.stat()-Operation möglicherweise vor der fs.rename()-Operation abgeschlossen wird.

const fs = require('node:fs');

fs.rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  console.log('renamed complete');
});
fs.stat('/tmp/world', (err, stats) => {
  if (err) throw err;
  console.log(`stats: ${JSON.stringify(stats)}`);
});

Es ist wichtig, die Operationen korrekt zu ordnen, indem man auf die Ergebnisse der einen wartet, bevor die andere aufgerufen wird.

import { rename, stat } from 'node:fs/promises';

const oldPath = '/tmp/hello';
const newPath = '/tmp/world';

try {
  await rename(oldPath, newPath);
  const stats = await stat(newPath);
  console.log(`stats: ${JSON.stringify(stats)}`);
} catch (error) {
  console.error('there was an error:', error.message);
}
const { rename, stat } = require('node:fs/promises');

(async function(oldPath, newPath) {
  try {
    await rename(oldPath, newPath);
    const stats = await stat(newPath);
    console.log(`stats: ${JSON.stringify(stats)}`);
  } catch (error) {
    console.error('there was an error:', error.message);
  }
})('/tmp/hello', '/tmp/world');

Oder, wenn Sie die Callback-APIs verwenden, verschieben Sie den fs.stat()-Aufruf in den Callback der fs.rename()-Operation.

import { rename, stat } from 'node:fs';

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`stats: ${JSON.stringify(stats)}`);
  });
});
const { rename, stat } = require('node:fs/promises');

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`stats: ${JSON.stringify(stats)}`);
  });
});

Dateipfade#

Die meisten fs-Operationen akzeptieren Dateipfade, die als String, als <Buffer> oder als <URL>-Objekt unter Verwendung des file:-Protokolls angegeben werden können.

String-Pfade#

String-Pfade werden als UTF-8-Zeichenfolgen interpretiert, die den absoluten oder relativen Dateinamen identifizieren. Relative Pfade werden relativ zum aktuellen Arbeitsverzeichnis aufgelöst, das durch den Aufruf von process.cwd() bestimmt wird.

Beispiel für die Verwendung eines absoluten Pfads unter POSIX.

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('/open/some/file.txt', 'r');
  // Do something with the file
} finally {
  await fd?.close();
}

Beispiel für die Verwendung eines relativen Pfads unter POSIX (relativ zu process.cwd()).

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('file.txt', 'r');
  // Do something with the file
} finally {
  await fd?.close();
}
Datei-URL-Pfade#

Für die meisten Funktionen des node:fs-Moduls kann das Argument path oder filename als <URL>-Objekt unter Verwendung des file:-Protokolls übergeben werden.

import { readFileSync } from 'node:fs';

readFileSync(new URL('file:///tmp/hello'));

file:-URLs sind immer absolute Pfade.

Plattformspezifische Überlegungen#

Unter Windows werden file:-<URL>s mit einem Hostnamen in UNC-Pfade konvertiert, während file:-<URL>s mit Laufwerksbuchstaben in lokale absolute Pfade konvertiert werden. file:-<URL>s ohne Hostnamen und ohne Laufwerksbuchstaben führen zu einem Fehler.

import { readFileSync } from 'node:fs';
// On Windows :

// - WHATWG file URLs with hostname convert to UNC path
// file://hostname/p/a/t/h/file => \\hostname\p\a\t\h\file
readFileSync(new URL('file://hostname/p/a/t/h/file'));

// - WHATWG file URLs with drive letters convert to absolute path
// file:///C:/tmp/hello => C:\tmp\hello
readFileSync(new URL('file:///C:/tmp/hello'));

// - WHATWG file URLs without hostname must have a drive letters
readFileSync(new URL('file:///notdriveletter/p/a/t/h/file'));
readFileSync(new URL('file:///c/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute

file:-<URL>s mit Laufwerksbuchstaben müssen einen : als Trennzeichen direkt nach dem Laufwerksbuchstaben verwenden. Die Verwendung eines anderen Trennzeichens führt zu einem Fehler.

Auf allen anderen Plattformen werden file:-<URL>s mit einem Hostnamen nicht unterstützt und führen zu einem Fehler.

import { readFileSync } from 'node:fs';
// On other platforms:

// - WHATWG file URLs with hostname are unsupported
// file://hostname/p/a/t/h/file => throw!
readFileSync(new URL('file://hostname/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: must be absolute

// - WHATWG file URLs convert to absolute path
// file:///tmp/hello => /tmp/hello
readFileSync(new URL('file:///tmp/hello'));

Eine file:-<URL>, die kodierte Slash-Zeichen enthält, führt auf allen Plattformen zu einem Fehler.

import { readFileSync } from 'node:fs';

// On Windows
readFileSync(new URL('file:///C:/p/a/t/h/%2F'));
readFileSync(new URL('file:///C:/p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */

// On POSIX
readFileSync(new URL('file:///p/a/t/h/%2F'));
readFileSync(new URL('file:///p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
/ characters */

Unter Windows führt eine file:-<URL>, die kodierte Backslashes enthält, zu einem Fehler.

import { readFileSync } from 'node:fs';

// On Windows
readFileSync(new URL('file:///C:/path/%5C'));
readFileSync(new URL('file:///C:/path/%5c'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */
Buffer-Pfade#

Pfade, die unter Verwendung eines <Buffer> angegeben werden, sind hauptsächlich auf bestimmten POSIX-Betriebssystemen nützlich, die Dateipfade als undurchsichtige Byte-Sequenzen behandeln. Auf solchen Systemen ist es möglich, dass ein einzelner Dateipfad Teilsequenzen enthält, die mehrere Zeichenkodierungen verwenden. Wie bei String-Pfaden können <Buffer>-Pfade relativ oder absolut sein.

Beispiel für die Verwendung eines absoluten Pfads unter POSIX.

import { open } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

let fd;
try {
  fd = await open(Buffer.from('/open/some/file.txt'), 'r');
  // Do something with the file
} finally {
  await fd?.close();
}
Arbeitsverzeichnisse pro Laufwerk unter Windows#

Unter Windows folgt Node.js dem Konzept des laufwerksbezogenen Arbeitsverzeichnisses. Dieses Verhalten kann beobachtet werden, wenn ein Laufwerkspfad ohne Backslash verwendet wird. Zum Beispiel kann fs.readdirSync('C:\\') potenziell ein anderes Ergebnis liefern als fs.readdirSync('C:'). Weitere Informationen finden Sie auf dieser MSDN-Seite.

Dateideskriptoren#

Auf POSIX-Systemen verwaltet der Kernel für jeden Prozess eine Tabelle der aktuell geöffneten Dateien und Ressourcen. Jeder offenen Datei wird ein einfacher numerischer Bezeichner, ein sogenannter Dateideskriptor, zugewiesen. Auf Systemebene verwenden alle Dateisystemoperationen diese Dateideskriptoren, um jede spezifische Datei zu identifizieren und zu verfolgen. Windows-Systeme verwenden einen anderen, aber konzeptionell ähnlichen Mechanismus zur Verfolgung von Ressourcen. Um die Dinge für Benutzer zu vereinfachen, abstrahiert Node.js die Unterschiede zwischen den Betriebssystemen und weist allen offenen Dateien einen numerischen Dateideskriptor zu.

Die Callback-basierten fs.open()- und die synchronen fs.openSync()-Methoden öffnen eine Datei und weisen einen neuen Dateideskriptor zu. Sobald er zugewiesen ist, kann der Dateideskriptor verwendet werden, um Daten aus der Datei zu lesen, in die Datei zu schreiben oder Informationen über die Datei anzufordern.

Betriebssysteme begrenzen die Anzahl der Dateideskriptoren, die zu einem bestimmten Zeitpunkt geöffnet sein können, daher ist es entscheidend, den Deskriptor zu schließen, wenn die Operationen abgeschlossen sind. Dies nicht zu tun, führt zu einem Speicherleck, das schließlich zum Absturz einer Anwendung führen wird.

import { open, close, fstat } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('/open/some/file.txt', 'r', (err, fd) => {
  if (err) throw err;
  try {
    fstat(fd, (err, stat) => {
      if (err) {
        closeFd(fd);
        throw err;
      }

      // use stat

      closeFd(fd);
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
});

Die Promise-basierten APIs verwenden ein <FileHandle>-Objekt anstelle des numerischen Dateideskriptors. Diese Objekte werden vom System besser verwaltet, um sicherzustellen, dass keine Ressourcen verloren gehen. Es ist jedoch weiterhin erforderlich, sie zu schließen, wenn die Operationen abgeschlossen sind.

import { open } from 'node:fs/promises';

let file;
try {
  file = await open('/open/some/file.txt', 'r');
  const stat = await file.stat();
  // use stat
} finally {
  await file.close();
}

Threadpool-Nutzung#

Alle Callback- und Promise-basierten Dateisystem-APIs (mit Ausnahme von fs.FSWatcher()) verwenden den Thread-Pool von libuv. Dies kann für einige Anwendungen überraschende und negative Leistungsauswirkungen haben. Weitere Informationen finden Sie in der Dokumentation zu UV_THREADPOOL_SIZE.

Dateisystem-Flags#

Die folgenden Flags sind überall dort verfügbar, wo die flag-Option einen String akzeptiert.

  • 'a': Datei zum Anhängen öffnen. Die Datei wird erstellt, wenn sie nicht existiert.

  • 'ax': Wie 'a', schlägt aber fehl, wenn der Pfad existiert.

  • 'a+': Datei zum Lesen und Anhängen öffnen. Die Datei wird erstellt, wenn sie nicht existiert.

  • 'ax+': Wie 'a+', schlägt aber fehl, wenn der Pfad existiert.

  • 'as': Datei zum Anhängen im synchronen Modus öffnen. Die Datei wird erstellt, wenn sie nicht existiert.

  • 'as+': Datei zum Lesen und Anhängen im synchronen Modus öffnen. Die Datei wird erstellt, wenn sie nicht existiert.

  • 'r': Datei zum Lesen öffnen. Eine Ausnahme tritt auf, wenn die Datei nicht existiert.

  • 'rs': Datei zum Lesen im synchronen Modus öffnen. Eine Ausnahme tritt auf, wenn die Datei nicht existiert.

  • 'r+': Datei zum Lesen und Schreiben öffnen. Eine Ausnahme tritt auf, wenn die Datei nicht existiert.

  • 'rs+': Datei zum Lesen und Schreiben im synchronen Modus öffnen. Weist das Betriebssystem an, den lokalen Dateisystem-Cache zu umgehen.

    Dies ist in erster Linie nützlich zum Öffnen von Dateien auf NFS-Mounts, da es das Überspringen des potenziell veralteten lokalen Caches ermöglicht. Es hat einen sehr realen Einfluss auf die E/A-Leistung, daher wird die Verwendung dieses Flags nicht empfohlen, sofern nicht erforderlich.

    Dies verwandelt fs.open() oder fsPromises.open() nicht in einen synchronen blockierenden Aufruf. Wenn eine synchrone Operation gewünscht ist, sollte so etwas wie fs.openSync() verwendet werden.

  • 'w': Datei zum Schreiben öffnen. Die Datei wird erstellt (wenn sie nicht existiert) oder gekürzt (wenn sie existiert).

  • 'wx': Wie 'w', schlägt aber fehl, wenn der Pfad existiert.

  • 'w+': Datei zum Lesen und Schreiben öffnen. Die Datei wird erstellt (wenn sie nicht existiert) oder gekürzt (wenn sie existiert).

  • 'wx+': Wie 'w+', schlägt aber fehl, wenn der Pfad existiert.

flag kann auch eine Zahl sein, wie in open(2) dokumentiert; häufig verwendete Konstanten sind über fs.constants verfügbar. Unter Windows werden Flags gegebenenfalls in ihre Äquivalente übersetzt, z. B. O_WRONLY in FILE_GENERIC_WRITE oder O_EXCL|O_CREAT in CREATE_NEW, wie sie von CreateFileW akzeptiert werden.

Das Exklusiv-Flag 'x' (O_EXCL-Flag in open(2)) führt dazu, dass die Operation einen Fehler zurückgibt, wenn der Pfad bereits existiert. Unter POSIX führt die Verwendung von O_EXCL bei einem symbolischen Link zu einem Fehler, selbst wenn der Link auf einen Pfad zeigt, der nicht existiert. Das Exklusiv-Flag funktioniert möglicherweise nicht mit Netzwerkdateisystemen.

Unter Linux funktionieren positionelle Schreibvorgänge nicht, wenn die Datei im Anfügemodus geöffnet wurde. Der Kernel ignoriert das Positionsargument und fügt die Daten immer an das Ende der Datei an.

Das Ändern einer Datei anstelle ihres Ersetzens erfordert möglicherweise, dass die flag-Option auf 'r+' anstatt auf das Standard-'w' gesetzt wird.

Das Verhalten einiger Flags ist plattformspezifisch. Daher führt das Öffnen eines Verzeichnisses unter macOS und Linux mit dem 'a+'-Flag, wie im folgenden Beispiel, zu einem Fehler. Im Gegensatz dazu wird unter Windows und FreeBSD ein Dateideskriptor oder ein FileHandle zurückgegeben.

// macOS and Linux
fs.open('<directory>', 'a+', (err, fd) => {
  // => [Error: EISDIR: illegal operation on a directory, open <directory>]
});

// Windows and FreeBSD
fs.open('<directory>', 'a+', (err, fd) => {
  // => null, <fd>
});

Unter Windows schlägt das Öffnen einer vorhandenen versteckten Datei mit dem 'w'-Flag (entweder durch fs.open(), fs.writeFile() oder fsPromises.open()) mit EPERM fehl. Vorhandene versteckte Dateien können mit dem 'r+'-Flag zum Schreiben geöffnet werden.

Ein Aufruf von fs.ftruncate() oder filehandle.truncate() kann verwendet werden, um den Dateiinhalt zurückzusetzen.