• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Operationen mit dateien in Perl

lolo

New member
Hallihallo, ich brauche mal wieder eure Hilfe!

Es geht um folgendes:

Ich moechte mir in Perl ein Gaestebuch schreiben, und dazu brauche ich ein paar Informationen:

1. Wie kann man in Perl feststellen, ob eine Datei existiert
(sie soll nicht angelegt werden, nur schauen, ob sie da
ist)?

2. Wie loescht man dort Dateien?

3. Gibt es eine delay-funktion in Perl? Und wenn ja, was
fuer eine Syntax hat sie?


Ich danke euch vielmalls im voraus,

TIA
 
Hallo,

zu 1.: Die Existenz einer Datei kann man einfach mit einer bedingten Anweisung abfragen, wie z.B.

if (-e $dateiname)
{
...
}

Das -e ist der entscheidende Operator. -s beispielsweise überprüft stattdessen, ob die Datei nicht die Länge 0 hat.

zu 2.: Dateien kann man in Perl mit der Funktion "unlink" löschen. Die Syntax sieht folgendermaßen aus:

unlink "$dateiname";

zu 3.: Kan ich pauschal nicht beantworten, kommt auf den genauen Einsatzzweck an.
 
Danke dir sehr, du hast mir wirklich viel geholfen.
Die delay funktion brauch' ich, um gewaehrleisten zu koennen, dass nicht ein paar leute gleichzeiti die datei oefnnen wollen. Ich hab' mir das so gedacht. Beim abschicken des Eintrags prueft das buch, ob eine datei z.B. busy existiert. Wenn diese Datei NICHT existiert, wird sie angelegt, die gaestebuch-datei geoffnet, der eintrag eingetragen, die buch-datei geschlossen, und die datei busy geloescht.
Wenn aber die Datei busy existiert, was heisst das das gaestebuch gerade benutzt wird, wartet das script z.B. 100ms und versucht es erneut. Das kann natuerlich nicht ewig dauern, so das nach z.B. 10 versuchen (1s) das script meldet, dass das gaestebuch benutzt wird o.ae.
Ist vielleicht 'n bisschen umstaendlich, sollte aber funktionieren.
Vielleicht kennst du 'ne bessere methode fuer so etwas? Ich will das Buch auf jeden Fall selber schreiben, nicht 'n kostenloses aus'm netz laden

TIA,
Lolo
 
Hallo,

Erstmal danke für Dein interessantes Problem - dabei habe ich doch gleich mal wieder mein Wissen um die Programmierung von Schleifen auffrischen können ;-)

Aber jetzt zu meinem Lösungsansatz. Eine delay-Funktion mit Zeitsteuerung (z.B. in sec/milisec) habe ich nicht gefunden, aber man kann das ganze mit einem Index auch erreichen. Das ganze sähe dann so aus:

#!/usr/bin/perl

$lockfile='busy';

if ( -e $lockfile )
{
# (2)
for ( $i = 1; $i <= 500000; $i++ )
{
# (3)
if ( !-e $lockfile )
{
goto GBSKRIPT;
exit;
}
}
# (4)
print "Content-type: text/html\n\n";
print "<p>Sorry - die Gästebuch-Datei wird gerade verwendet. Bitte versuchen Sie es nochmal!</p>\n";
}
else
{
# (1)
GBSKRIPT:
# Hier das eigentliche GBOOK-Skript einfügen
print "Content-type: text/html\n\n";
print "<p>Test einer delay-ähnlichen Schleife.</p>\n";
print "<p>Dieser Text wird angezeigt, wenn die Datei 'busy' nicht vorhanden ist.</p>\n";
exit;
}

Kurze Erklärung dazu:
Das Lockfile nennen wir mal - wie bisher - "busy". Zuerst überprüft das Skript beim Aufruf die Existenz von "busy" - wenn sie nicht existiert, ist alles OK und es wird das eigentliche Skript, das nach (1) steht, ausgeführt. Hier musst Du also den restlichen GB-Code einfügen - zur Demonstration habe ich ein paar print-Anweisungen eingefügt.
Wenn die Datei allerdings existiert, durchläuft das Skript bei (2) eine For-Schleife (in unserem Fall 500.000 Mal - je nach Server dauert das 0,5 - 1,5 sec.). Wenn die Datei "busy" irgendwann beim Durchlaufen der Schleife entfernt wird, sorgt die if-Anweisung bei (3) dafür, dass das Skript bei (1) fortgeführt wird - dafür sorgt der Befehl "goto" (funktioniert ähnlich wie ein Anker innerhalb einer HTML-Datei). Falls die Datei "busy" nach Durchlaufen der Schleife immer noch existiert, bricht das Skript mit der Fehlermeldung bei (4) ab.

So, und nun viel Spaß beim ausprobieren (bei mir hat's zumindest geklappt - evtl. muss der Pfad zu Perl in der ersten Zeile geändert werden.

So long,
Stefan
 
delay funktion in perl - es gibt sie doch ;-)

Danke erstmal fuer deine Loesung sie ist nicht schlecht, aber ich habe inzwischen die passende loesung gefunden. (Nicht mit 'ner for-schleife). Die delay funktion in perl heisst nicht delay, sondern sleep! Im buch steht bei mir dazu, dass sie so benutzt wird: sleep anzahl_sec , wobei anzahl_sec, die... anzahl der sekunden ist. Aber ich habe in einem script so was gesehen: sleep(1).
Falls du es mal brauchst. Gibt 'n bisschen weniger kod als deine Loesung.
 
Hallo,

Jetzt, wo Du's ansprichst, fällt mir die Funktion auch wieder ein. Danke für die Info!

Kleiner Nachtrag: Dateien kann man auch einfacher sperren - nämlich ohne eine zusätzliche Datei "busy" anzulegen. Die "flock"-Funktion sorgt dafür, dass eine Datei vor gleichzeitigen Zugriffen geschützt wird. Die Syntax sähe dann so aus:

flock (GBUCHDATEI, PARAMETER);

Als Parameter kann man 1, 2, 4 oder 8 einfügen:
1 (LOCK_SH, offener Zugriffsschutz, d.h. andere User können die Datei nur lesen)
2 (LOCK_EX, exklusiver Zugriffsschutz, d.h. andere User können die Datei auch nicht lesen)
4 (LOCK_NB, Zugriff anderer wird nicht blockiert)
8 (LOCK_UN, hebt den Zugriffsschutz wieder auf)

Mit entsprechenden Dateitestparametern (-r für lesbar, -w für beschreibbar) kann die Schleife dann auch ausgeführt werden.

So long,
Stefan
 
Mit =-w und -r kann ich dann ueberpruefen ob die datei nur lesen oder nur schreiben zulaesst oder was?

also

if( -w $file) wurde ueberpruefen, ob die datei schreiben zulaesst?

TIA
 
Hallo,

Genau so funktioniert's.

Abfrage: Datei lesbar?

if ( -r $datei )
{
...
}

Abfrage: Datei beschreibbar?

if ( -w $datei )
{
...
}

oder verknüpft, z.B. Datei existiert und ist beschreibbar:

if ( (-e $datei) && (-w $datei) )
{
...
}

Der flock-Befehl funktioniert übrigens nur auf UNIX/Linux-Systemen.

So long,
Stefan
 
Zurück
Oben