Start · Sprachen · JavaScript · Referenz · FileSystemDirectoryReader.readEntries()

FileSystemDirectoryReader.readEntries()

Methode

Liest den nächsten Block von Einträgen eines Verzeichnisses und übergibt sie als Array von <code>FileSystemEntry</code>-Objekten an einen Callback.

seit JavaScript Baseline: alle modernen Browser (File and Director Kategorie: webapi

Signatur

FileSystemDirectoryReader.prototype.readEntries(successCallback, errorCallback)

Beschreibung

Die Methode readEntries() eines FileSystemDirectoryReader liest die Einträge (Dateien und Unterverzeichnisse) des Verzeichnisses, zu dem der Reader gehört. Einen Reader bekommst du über FileSystemDirectoryEntry.createReader(), meistens nachdem ein Ordner per Drag & Drop (DataTransferItem.webkitGetAsEntry()) oder über ein <input type="file" webkitdirectory> bereitgestellt wurde.

Wichtig: Ein Aufruf liefert nicht unbedingt alle Einträge. Chromium gibt zum Beispiel höchstens 100 Einträge pro Aufruf zurück. Du musst readEntries() deshalb so lange wiederholt auf demselben Reader aufrufen, bis der Callback ein leeres Array bekommt. Erst dann ist das Verzeichnis vollständig gelesen.

Die API arbeitet nur mit Callbacks. In modernem Code packt man sie deshalb meist in ein Promise und liest dann mit async/await in einer Schleife oder rekursiv ganze Verzeichnisbäume ein. Jeder Eintrag ist entweder ein FileSystemFileEntry (isFile === true) oder ein FileSystemDirectoryEntry (isDirectory === true).

Parameter

Name Typ Default Beschreibung
$successCallback Pflicht (entries: FileSystemEntry[]) => void Wird mit einem Array der nächsten Verzeichniseinträge aufgerufen. Ein leeres Array bedeutet, dass es keine weiteren Einträge gibt.
$errorCallback (error: DOMException) => void Wird bei einem Fehler aufgerufen, z. B. wenn das Verzeichnis nicht mehr lesbar ist (NotFoundError) oder der Reader gerade schon liest (InvalidStateError).

Rückgabewert

Typ
undefined
Beschreibung
Kein Rückgabewert. Die Ergebnisse kommen nur über die Callbacks.

Beispiele

Einfacher Aufruf: ersten Block von Einträgen ausgeben

// dirEntry ist ein FileSystemDirectoryEntry, z. B. aus einem Drop-Event
const reader = dirEntry.createReader();

reader.readEntries(
  (entries) => {
    for (const entry of entries) {
      console.log(entry.isDirectory ? '📁' : '📄', entry.name);
    }
  },
  (err) => console.error('Lesefehler:', err.name)
);
📁 bilder 📄 notizen.txt

Alle Einträge vollständig lesen (Promise-Wrapper mit Schleife)

const readBatch = (reader) =>
  new Promise((resolve, reject) => reader.readEntries(resolve, reject));

const readAllEntries = async (dirEntry) => {
  const reader = dirEntry.createReader(); // denselben Reader wiederverwenden!
  const all = [];
  let batch;
  do {
    batch = await readBatch(reader);
    all.push(...batch);
  } while (batch.length > 0);
  return all;
};

const entries = await readAllEntries(dirEntry);
console.log(`${entries.length} Einträge gefunden`);
250 Einträge gefunden

Ordner per Drag & Drop rekursiv einlesen

const readBatch = (reader) =>
  new Promise((resolve, reject) => reader.readEntries(resolve, reject));
const getFile = (fileEntry) =>
  new Promise((resolve, reject) => fileEntry.file(resolve, reject));

const collectFiles = async (entry, files = []) => {
  if (entry.isFile) {
    files.push({ path: entry.fullPath, file: await getFile(entry) });
  } else if (entry.isDirectory) {
    const reader = entry.createReader();
    let batch;
    while ((batch = await readBatch(reader)).length > 0) {
      for (const child of batch) await collectFiles(child, files);
    }
  }
  return files;
};

const dropZone = document.querySelector('#drop-zone');
dropZone.addEventListener('dragover', (e) => e.preventDefault());
dropZone.addEventListener('drop', async (e) => {
  e.preventDefault();
  // Einträge SYNCHRON holen, bevor das DataTransfer ungültig wird
  const roots = [...e.dataTransfer.items]
    .map((item) => item.webkitGetAsEntry())
    .filter(Boolean);

  const results = [];
  for (const root of roots) await collectFiles(root, results);
  results.forEach(({ path, file }) => console.log(path, file.size, 'Bytes'));
});
/projekt/index.html 1532 Bytes /projekt/css/style.css 842 Bytes

// Wichtig · Fallstricke

  • Häufigster Fehler: readEntries() nur einmal aufrufen. In Chromium kommen pro Aufruf höchstens 100 Einträge zurück, bei größeren Ordnern fehlen dann still und ohne Fehlermeldung Dateien. Deshalb immer so lange aufrufen, bis ein leeres Array kommt.
  • Für jeden weiteren Aufruf denselben Reader verwenden. Ein neuer Reader über createReader() fängt wieder von vorne an, und die Schleife endet nie.
  • Rufst du die Methode erneut auf, bevor der vorige Aufruf fertig ist, gibt es einen InvalidStateError. Also nacheinander mit await lesen, nicht parallel.
  • Bei Drag & Drop gilt DataTransfer nur synchron im drop-Handler. webkitGetAsEntry() musst du deshalb aufrufen, bevor zum ersten Mal await kommt.
  • Die Reihenfolge der Einträge ist nicht festgelegt. Wenn du eine Reihenfolge brauchst, sortiere selbst.
  • Kompatibilität: Chrome, Edge, Firefox und Safari unterstützen die Methode. Sie gehört zur älteren File and Directory Entries API. Für neuen Code mit Lese- und Schreibzugriff ist die File System API (FileSystemDirectoryHandle, showDirectoryPicker()) die modernere Alternative, wird aber nicht überall unterstützt.