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