Signatur
Beschreibung
Ein Metadata-Objekt gehört zur alten File and Directory Entries API und beschreibt einen Eintrag im Dateisystem, also eine Datei oder ein Verzeichnis. Man erstellt es nicht selbst. Es wird der Erfolgs-Callback von FileSystemEntry.getMetadata() übergeben.
Das Interface hat zwei schreibgeschützte Eigenschaften:
modificationTime(Date): der Zeitpunkt der letzten Änderung des Eintrags.size(number): die Größe in Bytes als 64-Bit-Ganzzahl. Bei Verzeichnissen ist der Wert immer0.
Nützlich ist Metadata vor allem in älterem Code, der mit Drag-and-Drop-Einträgen (DataTransferItem.webkitGetAsEntry()) oder dem privaten Sandbox-Dateisystem (webkitRequestFileSystem()) arbeitet. Dort kann man damit Größe und Änderungsdatum abfragen, ohne die Datei zu lesen. Für neuen Code ist das Interface nicht mehr gedacht. Besser sind File.size, File.lastModified und die File System Access API bzw. das Origin Private File System (FileSystemFileHandle.getFile()).
Rückgabewert
modificationTime (Date) und size (number, Bytes). Man bekommt es nur über den Callback von FileSystemEntry.getMetadata().Beispiele
Metadaten eines per Drag & Drop abgelegten Eintrags lesen
const dropZone = document.querySelector('#drop-zone');
dropZone.addEventListener('dragover', (event) => event.preventDefault());
dropZone.addEventListener('drop', (event) => {
event.preventDefault();
for (const item of event.dataTransfer.items) {
const entry = item.webkitGetAsEntry?.();
if (!entry || typeof entry.getMetadata !== 'function') continue;
entry.getMetadata(
(metadata) => {
console.log(`${entry.name}: ${metadata.size} Bytes, geändert am ${metadata.modificationTime.toLocaleString('de-DE')}`);
},
(error) => console.error('Metadaten nicht lesbar:', error.name)
);
}
});
getMetadata() in ein Promise verpacken
const getMetadataAsync = (entry) =>
new Promise((resolve, reject) => {
if (typeof entry.getMetadata !== 'function') {
reject(new Error('getMetadata() wird nicht unterstützt'));
return;
}
entry.getMetadata(resolve, reject);
});
// Verwendung mit async/await, z. B. innerhalb eines drop-Handlers
const describeEntry = async (entry) => {
try {
const { size, modificationTime } = await getMetadataAsync(entry);
const art = entry.isDirectory ? 'Verzeichnis' : 'Datei';
return `${art} ${entry.name} – ${(size / 1024).toFixed(1)} KiB, Stand ${modificationTime.toISOString()}`;
} catch (err) {
return `${entry.name}: ${err.message}`;
}
};
Moderne Alternative: dieselben Informationen über File
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', () => {
for (const file of input.files) {
// Entspricht metadata.size und metadata.modificationTime
const modified = new Date(file.lastModified);
console.log(`${file.name}: ${file.size} Bytes, geändert ${modified.toLocaleDateString('de-DE')}`);
}
});
// Wichtig · Fallstricke
- Nicht standardisiert und veraltet:
MetadataundFileSystemEntry.getMetadata()gibt es praktisch nur in Chromium-basierten Browsern. Firefox und Safari unterstützen zwar Teile der File and Directory Entries API, aber nichtgetMetadata(). Prüfe deshalb vor dem Aufruf immer mittypeof entry.getMetadata === 'function', ob die Methode vorhanden ist. - Nur Callbacks: Die API gibt kein Promise zurück. Für
async/awaitmuss man sie selbst in ein Promise verpacken (siehe Beispiel). - Verzeichnisse: Bei einem Verzeichnis ist
sizeimmer0und gibt nicht die Gesamtgröße des Inhalts an. Die muss man selbst ausrechnen, indem man rekursiv über die Einträge geht. - Zeitzone:
modificationTimeist einDate-Objekt. Wie es angezeigt wird, hängt von der lokalen Zeitzone ab. Für eindeutige Werte eignet sichtoISOString(). - Neuer Code: Verwende lieber
File.size/File.lastModified, die File System Access API oder das Origin Private File System. Diese Schnittstellen sind standardisiert und funktionieren browserübergreifend.