Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Testen von Dateien

die Existenz einer Datei prüfen

die Existenz eines Ordners prüfen
prüfen, ob eine Datei leer ist
prüfen, ob eine Datei einen Inhalt hat
prüfen, wann eine Datei geschrieben / geändert wurde

die Existenz einer Datei prüfen

Manchmal sind Informationen über eine Datei ausgesprochen wichtig. Interessant ist, ob die Datei schon existiert, wann sie geschrieben wurde, ob sie leer ist oder, ob es sich um ein Verzeichnis oder eine Datei handelt.
Nebenbemerkung: Da Perl sich nicht beschwert, wenn auf eine Datei zugegriffen wird, die es (noch) nicht gibt, kann auch unsauber programmiert werden und die Anwendung läuft in den meisten Fällen.
Es gibt aber auch Anwendungen, die dann nicht mehr laufen. Dies ist zum Beispiel der Fall, wenn ein Websitegenerator programmiert wird und jeder User seinen Ordner, Zähler etc. erhalten soll. Dann muss festsgestellt werden, ob es die entsprechenden Ordner, Unterordner und Dateien schon gibt. Wenn nicht, dann müssen sie eingerichtet werden. Die Möglichkeit festzustellen, ob es sich um ein Verzeichnis oder um eine Datei handelt, ist auch entscheidend, wenn eine lokale Suchmaschine programmiert werden soll, siehe Suchmaschine.

Die Existenz einer Datei wird folgendermaßen geprüft:

mkdir("c:/testofix");
open(banane,">c:/testofix/testomat.txt");
print banane "Heureka ! Nun gibt es mich";
close(banane);
if (-e "c:/testofix/testomat.txt")
{
   print "Ich glaub ich habs gefunden, was du verloren hahahast, hahahast";
}
else
{
   print "ham wa nich";
}

Mit mkdir, siehe Arbeiten mit Verzeichnissen, richten wir einen Ordner testofix ein. In diesem Ordner legen wir dann die Datei testomat.txt und schreiben etwas rein.
Anschließend prüfen wir mit -e "c:/testofix/testomat.txt", ob diese Datei tatsächlich existiert.
-e "Name_der_Datei" gibt 1 zurück (den Wert für true), wenn die Datei existiert.
Schauen wir uns das kurz isoliert an:

$test=-e "c:/testofix/testomat.txt";
print $test;


Wir haben eine 1 auf dem Schirm. Das heißt, die Datei existiert.

die Existenz eines Ordners prüfen

Manchmal, siehe z.B. Suchmaschine wollen wir aber nur wissen, ob der Ordner überhaupt existiert. Ich gehe davon aus, dass der Ordner testofix aus dem vorherigen Beispiel nicht zwischendurch gelöscht wurde:

$test=-d "c:/testofix";
print $test;

Oder, eher ein real life Beispiel
if (-d "c:/testofix")
{
   print "Ich bin vorhanden!";
}
else
{
  mkdir("c:/testofix");
}

-d "c:/testofix" gibt 1 zurück, wenn der Ordner existiert. Das ist in unserem Beispiel der Fall. Existiert er nicht, wird er jetzt mit mkdir eingerichtet.

prüfen, ob eine Datei leer ist

Manchmal ist es auch interessant zu wissen, ob eine Datei leer ist (keinen Inhalt hat). Der nächste Befehl gilt aber nur für Dateien, nicht für Verzeichnisse. Das heißt, es kann so nicht festgestellt werden, ob das Verzeichnis einen Inhalt hat:
Ein kleines Beispiel illustriert das:

open(banane,">c:/testofix/testomat.txt");
close(banane);

if (-z "c:/testofix/testomat.txt")
{
   print "Alles klar, ich bin platt";
}
else
{
print "Hm. da steht schon was";  

}

Mit dem Operatror -z (zero) wird geprüft, ob eine Datei leer ist.
Damit die Datei, die wir prüfen wollen, testomat.txt, auch tatsächlich leer ist, öffnen wir sie, schreiben aber nichts rein. Anschließend prüfen wir.
Da sie leer ist, erhalten wir
Alles klar, ich bin platt.

prüfen, ob eine Datei einen Inhalt hat

Nach dem gleichen Schema kann auch geprüft werden, ob in der Datei etwas steht.

open(banane,">c:/testofix/testomat.txt");
close(banane);

if (!-z "c:/testofix/testomat.txt")
{
   print "Hm. da steht schon was";
}
else
{
print "Alles klar, ich bin platt";  
}

Die einzige Änderung ist das ! Zeichen. Damit wird das Ergebnis der Bedingung negiert, das heißt, aus 1 wird 0.
Man kann also mit der Negierung des -z Operators prüfen, ob in der Datei was drin steht.

Im folgenden Beispiel wird mit dem -s Operator direkt geprüft wird, ob in der Datei etwas drin steht:

open(banane,">c:/testofix/testomat.txt");
print banane "Hello to you friends of peace";
close(banane);

if (-s "c:/testofix/testomat.txt")
{
   print "Wenn in testomat.txt was steht, dann erscheine ich.";
}
else
{
print "Wenn in testomat.txt nichts steht, dann ist was schiefgelaufen.";  
}

Ergebnis:
Wenn in testomat.txt was steht, dann erscheine ich.

prüfen, wann eine Datei geschrieben / geändert wurde

Wann wurde eine Datei geändert?. Das folgende Beispiel gibt uns die Antwort:

open(banane,">c:/testofix/testomat.txt");
print banane "Hello to you friends of peace";
close(banane);
$tag=-M "c:/testofix/testomat.txt";
print $tag;

Es erscheint etwas in der Art:1.45345444444.
Das heißt, 1,45 Tage also so etwa 35 Stunden ( 24 Stunden + 0,45 * 24).

Schreiben wir ein Programm, dass diesen Tatbestand eindeutig illustriert:

$test="c:/testofix/tescht2.txt";
open(banane,">>$test");
print banane "Super !";
close(banane);
sleep(10);
print -M $test;
print "\n";
printf("seit %.8f Tagen nicht modifiziert",  -M $test);

Wir generieren also eine Datei, dann schicken wir Perl 10 Sekunden (sleep(10)) lang schlafen. Wir lassen uns die Zeit ausgeben, die vergangen ist, seit die Datei generiert worden ist, und zwar als Bruchteil eines vollen Tages. Das sind natürlich ziemlich genau 10 Sekunden. Was müsste also rauskommen?

0,00001157 was wiederum (1/24 * 1/60 * 1/60=0,00001157) entspricht.

Genau das kommt auch raus.
Die Nachkommastellen werden als Potenz angegeben, so dass mit der printf zurückkonvertiert werden muss.

Die printf Funktion ist noch erklärungsbedürftig. Mit dem % Zeichen wird die Formatierung eingeleitet. Durch eine Zahl nach dem Punkt kann man erzwingen, wie viele Stellen die Zahl insgesamt hat. Ist die Zahl aber kleiner als 1, und das ist hier der Fall, macht das keinen Sinn. Bei einer Zahl, die kleiner ist als 1, kann man nicht gleichzeitig verlangen, dass sie 8 Nachkommastellen haben soll und insgesamt 20 Stellen. Die Zahl nach dem Punkt gibt die Nachkommastellen an. Wir wollen also, dass die Zahl, die ursprünglich in Exponentialschreibweise vorliegt, in eine Zahl konvertiert wird, die so viele Stellen nach dem Komma hat wie sie halt braucht. In unserem Falle also 8 Stellen nach dem Komma. Mit Hilfe des -M Operators wäre es z.B. möglich, alle Dateien, die seit 2 Tagen nicht mehr geändert wurden, zu entfernen siehe Arbeiten mit Verzeichnissen.
vorhergehendes Kapitel