filesize()
Die Funktion filesize() ist eine eingebaute PHP-Funktion, die die Größe einer Datei in Bytes als Integer zurückgibt.
Was ist die Funktion filesize()?
filesize() ist eine eingebaute PHP-Funktion, die die Größe einer Datei in Bytes als Integer zurückgibt. Sie ist der Standardweg, um herauszufinden, wie viel Speicherplatz eine Datei belegt, bevor man sie herunterlädt, anzeigt, einen Upload validiert oder entscheidet, ob man sie in den Arbeitsspeicher laden möchte.
Diese Seite behandelt die Syntax, die Bedeutung des Rückgabewerts, den wichtigen Fallstrick bei gecachten Ergebnissen, die Umwandlung von rohen Bytes in einen lesbaren String sowie den sicheren Umgang mit fehlenden oder nicht lesbaren Dateien.
Syntax
filesize(string $filename): int|false$filename— Pfad zur Datei. Es kann ein relativer Pfad, ein absoluter Pfad oder ein URL-Wrapper sein (z. B.http://,ftp://), sofern das Protokoll die Größenangabe unterstützt.- Rückgabewert — Die Größe der Datei in Bytes als Integer oder
falsebei einem Fehler (z. B. wenn die Datei nicht existiert oder keine Zugriffsberechtigung vorliegt).
Da die Größe in Bytes angegeben wird, entspricht ein gemeldeter Wert von 2048 genau 2 KB und 1048576 genau 1 MB.
Ein einfaches Beispiel
Das folgende Beispiel erstellt eine kleine temporäre Datei, schreibt einen bekannten String hinein und gibt ihre Größe aus. Das Erstellen der Datei vorab macht das Beispiel vollständig eigenständig und ausführbar:
<?php
$filename = 'example.txt';
file_put_contents($filename, 'Hello, world!'); // 13 bytes
$bytes = filesize($filename);
echo "The file '$filename' is $bytes bytes.";
// The file 'example.txt' is 13 bytes.Der String Hello, world! besteht aus 13 ASCII-Zeichen, sodass die Datei genau 13 Bytes groß ist. Bei Textdateien in einer Single-Byte-Kodierung entspricht die Byte-Anzahl der Zeichenanzahl; Multi-Byte-Zeichen (UTF-8) zählen als mehr als ein Byte.
filesize()arbeitet mit der Datei so, wie sie auf der Festplatte liegt. Es werden keine Bytes im Arbeitsspeicher gezählt, und bei symbolischen Links wird die Größe der Zieldatei zurückgegeben.
Umgang mit fehlenden oder nicht lesbaren Dateien
Wenn die Datei nicht existiert, gibt filesize() false zurück und gibt eine Warnung aus. Prüfen Sie immer zuerst, ob die Datei existiert, um Fehler abfangen zu können:
<?php
$filename = 'does-not-exist.txt';
if (file_exists($filename)) {
echo filesize($filename) . " bytes";
} else {
echo "File not found.";
}
// File not found.Da false im lockeren Vergleich 0 entspricht, sollte man niemals if (filesize($f) == 0) schreiben, um auf eine leere Datei zu prüfen, ohne zuerst sicherzustellen, dass die Datei existiert — eine fehlende Datei und eine leere Datei würden identisch aussehen. Siehe file_exists() für die sichere Vorabprüfung.
Der Caching-Fallstrick (clearstatcache)
PHP speichert die Ergebnisse von Dateisystemfunktionen wie filesize(), filemtime() und stat() aus Leistungsgründen im Cache. Wenn sich eine Datei während desselben Skriptdurchlaufs ändert, kann filesize() die alte Größe zurückgeben. Rufen Sie clearstatcache() auf, um ein frisches Einlesen zu erzwingen:
<?php
$filename = 'log.txt';
file_put_contents($filename, 'first');
echo filesize($filename) . "\n"; // 5
file_put_contents($filename, 'first-second');
clearstatcache(); // discard the cached size
echo filesize($filename) . "\n"; // 12Ohne den Aufruf von clearstatcache() könnte das zweite echo immer noch 5 ausgeben. Dies ist die häufigste Ursache für „falsche" filesize()-Ergebnisse.
Bytes in eine lesbare Größe umwandeln
Rohe Byte-Zahlen sind schwer lesbar. Eine kleine Hilfsfunktion wandelt sie in KB, MB, GB usw. um:
<?php
function humanFilesize(int $bytes, int $decimals = 2): string
{
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$factor = (int) floor((strlen((string) $bytes) - 1) / 3);
$value = $bytes / (1024 ** $factor);
return number_format($value, $decimals) . ' ' . $units[$factor];
}
echo humanFilesize(13); // 13.00 B
echo "\n";
echo humanFilesize(2048); // 2.00 KB
echo "\n";
echo humanFilesize(1048576); // 1.00 MBHier übernimmt number_format() die Dezimalstellen, und 1024 ** $factor teilt durch die entsprechende Potenz von 1024. Verwenden Sie stattdessen round(), wenn Sie ein numerisches Ergebnis ohne Tausendertrennzeichen bevorzugen.
Wann sollte ich filesize() verwenden?
- Upload-Validierung — Dateien ablehnen, die eine bestimmte Größe überschreiten, bevor sie gespeichert werden (kombiniert mit
is_uploaded_file()). - Download-Header setzen — einen korrekten
Content-Length-Header senden, damit Browser einen Fortschrittsbalken anzeigen können. - Entscheiden, wie eine Datei gelesen wird — bei sehr großen Dateien diese mit
fopen()/fread()streamen, anstatt sie vollständig mitfile_get_contents()zu laden. - Überwachung — verfolgen, ob eine Log-Datei wie erwartet wächst.
Verwandte Funktionen
file_exists()— prüfen, ob eine Datei existiert, bevor ihre Größe gemessen wird.filemtime()— den Zeitpunkt der letzten Änderung einer Datei abrufen.filetype()— bestimmen, ob ein Pfad eine Datei, ein Verzeichnis oder ein Link ist.file_get_contents()— eine gesamte Datei als String einlesen.
Zusammenfassung
filesize() gibt die Größe einer Datei in Bytes zurück oder false bei einem Fehler. Prüfen Sie immer zuerst, ob die Datei existiert, denken Sie daran, clearstatcache() aufzurufen, wenn sich eine Datei während des Skripts ändert, und wandeln Sie Bytes bei der Ausgabe an Benutzer mithilfe einer Hilfsfunktion in eine benutzerfreundliche Einheit um.