|

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.
|
 |