Werbung einblenden Werbung ausblenden


Home / Tutorials / PHP Handbuch / Funktionen zum Testen von Dateien


Funktionen zum Testen von Dateien
Prüfen, ob eine Datei existiert
Ermitteln, wann auf die Datei zum letzten Mal zugegriffen wurde

Funktionen zum Testen von Dateien

Es kann viele Gründe geben, warum man Dateien überprüfen will. Bei Skripten, die man zum download anbietet, ist es sinnvoll, sie so zu schreiben, dass sie sich selbst initialisieren, also alle Dateien, die sie brauchen, selber einrichten. Dies setzt aber eine Prüfung voraus, ob sie nicht schon da sind. Ermitteln zu lassen, wann eine Datei generiert worden ist, kann dann sinnvoll sein, wenn man z.B. inaktive User löschen will. Eine Prüfung, die feststellt, ob es sich um ein Verzeichnis oder um eine Datei handelt kann sinnvoll sein, wenn man z.B. eine lokale Suchmaschine programmieren will. Den Dateityp will man wissen, wenn z.B. schauen will, ob es sich um ein Bild handelt oder eine Textdatei etc. etc. Viele Funktionen, die Dateien auf irgendetwas testen sind allerdings Unix spezifisch und geben nur unter Unix ein sinnvolles Ergebnis zurück. Das betrifft z.b. die Funktionen, die prüfen, zu welcher Gruppe oder Besitzer eine Datei gehört, welche Rechte festgelegt wurden, ob es einen Link auf die Datei gibt etc. Insgesamt gibt es wohl so etwa 60 Befehle. Wir werden die wichtigsten davon behandeln.

Prüfen, ob eine Datei existiert

Wird eine Datei gleich beim ersten mal, wenn sie verwendet wird, beschrieben, entstehen keine Probleme. PHP legt die Datei einfach an.

<?
$datei_handle=fopen("datei.txt","w+");
fwrite($datei_handle,"Ich bin nicht da");
fclose($datei_handle);
print "Funktionniert nicht";
?>

Leider ist das nicht der Fall, der normalerweise auftritt. Lässt man zum Beispiel bei einer Anwendung einen Zähler mitlaufen, wird dieser zuerst einmal ausgelesen, dann eins dazugezählt und dann zurückgeschrieben. Eine Datei, die zum Lesen geöffnet wird, muss aber, im Gegensatz zu Perl, wo es auch unsauber ist, aber trotzdem funktionniert, in PHP schon vorhanden sein. Sowas geht also nicht:

<?
$datei_handle=fopen("counter.txt",r);
$inhalt=fread($datei_handle,filesize("counter.txt"));
fclose($datei_handle);
$count=$inhalt[0]+1;
$datei_handle=fopen("counter.txt",w);
fwrite($datei_handle,$count);
fclose($datei_handle);
print "Counter wurde um eins erhöht";
?>

Die Datei counter.txt wird zwar generiert und es wird auch 1 eingetragen, allerdings erhalten wir ziemlich viele Fehlermeldungen.

Warning: fopen("counter.txt", "r") - No such file or directory in C:\sambar\docs\test.php on line 2
Warning: stat failed for counter.txt (errno=2 - No such file or directory) in C:\sambar\docs\test.php on line 3
Warning: fread(): supplied argument is not a valid File-Handle resource in C:\sambar\docs\test.php on line 3
Warning: fclose(): supplied argument is not a valid File-Handle resource in C:\sambar\docs\test.php on line 4
Counter wurde um eins erhöht

Man muss also in PHP dafür sorgen, dass nicht versucht wird, Dateien zu lesen, die nicht existieren. Das geht dann so:

<?
if(file_exists("counter.txt"))
{
$datei_handle=fopen("counter.txt",r);
$inhalt=fread($datei_handle,filesize("counter.txt"));
fclose($datei_handle);
$count=$inhalt[0]+1;
}
else
{
$count=1;
}
$datei_handle=fopen("counter.txt",w);
fwrite($datei_handle,$count);
fclose($datei_handle);
print "Counter wurde um eins erhöht";
?>

Dieser Skript wäre dann stabil. Die Funktion file_exists prüft, ob die entsprechende Datei überhaupt vorhanden ist und nur wenn sie vorhanden ist, wird sie geöffent. Der Rückgabewert von file_exists ist 1.

Ermitteln, wann auf die Datei zum letzten Mal zugegriffen wurde

<?
$letzter_zugriff= fileatime("counter.txt");
print $letzter_zugriff;
?>

Als Antwort erhalten wir eine ziemlich lange Zahl, so was wie 1038610800 bei der wir uns fragen, was sie eigentlich darstellen soll. Es ist der Zeitraum in Sekunden zwischen dem 1.Januar 1970 und der aktuellen Zeit. Damit ist klar, dass uns das nicht weiterhilft. Wir brauchen also noch eine Funktion, die aus dieser Anzahl an Sekunden ein "lesbares" Datum macht.

<?
$letzter_zugriff= fileatime("counter.txt");
print gmdate("M d Y H:i:s",$letzter_zugriff);
?>

Wir erhalten jetzt was englishes, z.B. Nov 29 2002 23:00:00. Andere Formate für Datumsangaben werden in dem Abschnitt Operationen mit Datumsangaben behandelt.

vorhergehendes Kapitel