SELFHTML

Funktionen f�r Datei- und Verzeichnis-Management

Informationsseite

nach unten Allgemeines zu diesen Funktionen
nach unten -[x] - Dateitestoperatoren f�r Dateien/Verzeichnisse
nach unten chdir - Verzeichnis wechseln
nach unten chmod - Datei-/Verzeichnisrechte �ndern
nach unten chown - Besitzer und Besitzergruppe von Dateien �ndern
nach unten chroot - Wurzelverzeichnis f�r Pfadnamen �ndern
nach unten glob - Dateien mit Wildcards ausw�hlen
nach unten link - neue Datei als Link auf vorhandene erzeugen
nach unten lstat - Eigenschaften einer Link-Datei
nach unten mkdir - Verzeichnis erstellen
nach unten readlink - Wert einer Link-Datei auslesen
nach unten rename - Datei/Verzeichnis umbenennen
nach unten rmdir - Verzeichnis l�schen
nach unten stat - Eigenschaften einer Datei ermitteln
nach unten symlink - neue Datei als symbolischen Link auf vorhandene erzeugen
nach unten umask - Umask des laufenden Prozesses �ndern
nach unten unlink - Dateien l�schen
nach unten utime - Zeitstempel von Dateien/Verzeichnissen �ndern

 nach unten 

Allgemeines zu diesen Funktionen

Perl kommt, wie bereits mehrfach betont wurde, aus der Unix-Welt. Daher sind die Funktionen rund um Datei- und Verzeichnismanagement auch an den typischen M�glichkeiten von Unix orientiert. Einige dieser Funktionen sind nur anwendbar, wenn Ihr Perl-Script auf einem Unix-System ausgef�hrt wird. Funktionen zur Dateiverwaltung, die auch auf anderen Betriebssystemen ausf�hrbar sind, k�nnen als "plattformunabh�ngig" bezeichnet werden, auch wenn das nicht absolut korrekt ist. Bei den hier aufgef�hrten Beschreibungen zu den einzelnen Funktionen zum Datei- und Verzeichnismanagement wird darauf hingewiesen, wenn es Beschr�nkungen auf bestimmte Betriebssystemtypen gibt.

Weitere Funktionen zur Dateiverwaltung, etwa zum Kopieren und Verschieben von Dateien, gibt es ebenfalls, doch geh�ren sie nicht zum Kernel von Perl. Solche Funktionen sind �ber das Seite Standardmodul File erreichbar.

Pfadnamen und Verzeichnisse:

Die hier beschriebenen Funktionen erwarten als Parameter Pfadangaben. Als Trennzeichen zwischen Verzeichnisnamen bei Pfadangaben benutzen Sie aus Portabilit�tsgr�nden am besten grunds�tzlich den einfachen Schr�gstrich, auch bei Perl-Scripts, die unter Windows laufen sollen. Perl unter Windows setzt dies intern in die Microsoft-eigenen Backslashes um.
Beispiele:

Syntaxbeispiel Bedeutung
".." relative Angabe, ein Verzeichnis h�her
"../../bin" relative Angabe, zwei Verzeichnisse h�her und von dort aus gerechnet Unterverzeichnis "bin"
"images" relative Angabe, Unterverzeichnis "images" im aktuellen Verzeichnis
"/" absolute Angabe, Wurzelverzeichnis
"/usr/bin/perl" absolute Angabe ab Wurzelverzeichnis
"c:/windows/system" absolute Angabe mit Laufwerksangabe - Windows-typisch

Relative Pfadangaben sollten Sie nur verwenden, wenn das aktuelle Arbeitsverzeichnis bekannt ist.
Um das aktuelle Arbeitsverzeichnis in Perl zu ermitteln, k�nnen Sie notieren:

use Cwd;
my $Arbeitsverzeichnis = cwd;

In dem Skalar $Arbeitsverzeichnis steht dann anschlie�end der vollst�ndige Pfad zum aktuellen Arbeitsverzeichnis. Benutzt wird dazu das Seite Standardmodul cwd.

Rechteangaben f�r Dateien und Verzeichnisse

Viele der hier beschriebenen Funktionen erwarten als Parameter eine Rechteangabe.

Bei Unix-Systemen haben alle Eintr�ge eines Dateisystems Rechte. Jede Datei, jedes Verzeichnis geh�rt einem Benutzer, und jeder Benutzer geh�rt zu einer Benutzergruppe. Der so genannte Superuser, also der Benutzer mit der so genannten root-Kennung, kann Benutzer und Benutzergruppen einrichten und manipulieren sowie Logindaten f�r die einzelnen Benutzer des Systems vergeben.

Ein Benutzer, der sich an einem Unix-System einloggt, erh�lt vom Betriebssystem eine individuelle Benutzerkennung, die User-ID (UID). Ebenso erh�lt jede Benutzergruppe eine Gruppen-ID (GID). Beide IDs sind Nummern. In einigen der hier beschriebenen Funktionen spielen diese IDs eine Rolle. Solche Funktionen sind dann in der Regel nur anwendbar, wenn das Perl-Script in einer Unix-Umgebung laufen soll.

Das System wei� stets, welcher eingeloggte Benutzer eine Datei oder ein Verzeichnis erzeugt. Die Datei bzw. das Verzeichnis geh�rt dann diesem Benutzer und seiner prim�ren Benutzergruppe. Grunds�tzlich werden auf Unix-Systemen f�r jede Datei und jedes Verzeichnis die Zugriffsrechte f�r den besitzenden Benutzer, seine prim�re Benutzergruppe und f�r Fremdbenutzer ("Rest der Welt") festgelegt. Dabei wird zwischen Leserecht, Schreibrecht und Ausf�hrungsrecht unterschieden. Jedes dieser drei Rechte (Lesen, Schreiben, Ausf�hren) kann f�r jede der drei Benutzertypen (Besitzer, zugeh�rige Gruppe und Rest der Welt) auf "ja" oder "nein" gesetzt werden. Die Darstellung dieser Rechte erfolgt �blicherweise in zwei Arten: entweder als eine Zeichenkette von 3 mal 3, also 9 Zeichen, oder als Oktalzahl mit 3 Ziffern.

Darstellung als Zeichenkette (Beispiele):

rwxrwxrwx
rw-r--r--
rwx------

Der Buchstabe r steht f�r Lesen (read), w f�r Schreiben (write), und x f�r Ausf�hren (execute). Ist ein solcher Buchstabe gesetzt, so ist damit das entsprechende Recht vergeben. Ist das entsprechende Recht nicht gesetzt, wird stattdessen ein Bindestrich - notiert. Die ersten drei der neun Zeichen bedeuten die Lese-, Schreib- und Ausf�hrungsrechte des besitzenden Benutzers der Datei, die zweiten drei Zeichen die Lese-, Schreib- und Ausf�hrungsrechte seiner Gruppe, und die dritten drei Zeichen die Lese-, Schreib- und Ausf�hrungsrechte f�r den "Rest der Welt". Der Wert rwxrwxrwx bedeutet also: alle drei Benutzertypen (besitzender Benutzer, zugeh�rige Gruppe und Rest der Welt) haben an der Datei alle drei Rechte.
Der Wert rw-r--r-- bedeutet: der besitzende Benutzer hat die Rechte "Lesen" und "Schreiben", aber nicht "Ausf�hren", seine Gruppe und der Rest der Welt haben nur das Recht "Lesen", aber nicht die Rechte "Schreiben" und "Ausf�hren".
Der Wert rwx------ bedeutet: der besitzende Benutzer hat alle Rechte, seine Gruppe und der Rest der Welt haben �berhaupt keine Rechte.

Darstellung als Oktalzahl (gleiche Beispiele wie zuvor):

0777
0644
0700

Bei dieser Darstellung, die von den meisten der hier beschriebenen Funktionen gefordert wird, wird eine Zahl mit einer f�hrenden 0 notiert, was Perl die Zahl als Oktalzahl interpretieren l�sst. Die Zahl selber besteht aus den 3 nachfolgenden Ziffern. Bei Oktalzahlen sind nur Ziffern zwischen 0 und 7 erlaubt. Die erste Ziffer steht f�r die Rechte des besitzenden Benutzers, die zweite Ziffer f�r die seiner Benutzergruppe, und die dritte f�r die vom "Rest der Welt". Die Ziffern haben folgende Bedeutung f�r die Rechtezuweisung:

Der Wert 0777 bedeutet also: alle drei Benutzertypen (besitzender Benutzer, zugeh�rige Gruppe und Rest der Welt) haben an der Datei alle drei Rechte.
Der Wert 0644 bedeutet also: der besitzende Benutzer hat die Rechte "Lesen" und "Schreiben", seine Gruppe und der Rest der Welt haben nur das Recht "Lesen".
Der Wert 0700 bedeutet also: der besitzende Benutzer hat alle Rechte, seine Gruppe und der Rest der Welt haben �berhaupt keine Rechte.

Beachten Sie:

Als Hilfe f�r Dateirechte k�nnen Sie auch den Seite Unix-Dateirechte-Setzer (chmod) benutzen.

nach obennach unten

-[x] - Dateitestoperatoren f�r Dateien/Verzeichnisse

Die einfachste und schnellste Methode, gezielt auf bestimmte Eigenschaften einer Datei oder eines Verzeichnisses zuzugreifen, ist diejenige, die Perl mit den Dateitestoperatoren zur Verf�gung stellt. Einige der Dateitestoperatoren geben eine Zahl zur�ck, beispielsweise die Gr��e einer Datei in Bytes, andere nur, ob eine Aussage zutrifft oder nicht. Eine �bersicht der Dateitestoperatoren finden Sie in der nach unten  Tabelle der Dateitestoperatoren.

Beispiel 1 eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Textdatei = "/usr/bin/myprog/readme.txt";
my $UnbekannteDatei = "/usr/bin/myprog/doit";
my $Perl-Datei = "/usr/webcgi-local/betrag.pl";
my $Log-Datei = "/usr/web/logs/heute.log";

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><body>\n";
print "Die Textdatei hat eine Gr��e von ",-s $Textdatei," Bytes<br>\n";
printf "Die Textdatei wurde vor %.3f Tagen zuletzt bearbeitet<br>\n",-M $Textdatei;
print "Die unbekannte Datei ist ",-d $UnbekannteDatei ? "ein Verzeichnis<br>\n" : "kein Verzeichnis<br>\n";
print "Die Perl-Datei ",-e $Perl-Datei ? "existiert<br>\n" : "existiert nicht<br>\n";
print "Es hat Zugriffe gegeben" if not -z $Log-Datei;
print "</body></html>\n";

Erl�uterung:

Alle Dateitestoperatoren zum Abfragen von Eigenschaften bestehen aus einem Minuszeichen, gefolgt von einem Buchstaben ohne Leerzeichen dazwischen. Dahinter folgt, durch ein Leerzeichen getrennt, die Angabe der gew�nschten Datei, wenn erforderlich mit vollst�ndigem nach oben Pfadnamen.

Im obigen Beispiel 1 werden drei Skalare definiert, die Dateinamen mit Pfadangaben speichern. Anschlie�end wird HTML-Code ausgegeben. Dabei werden verschiedene Aussagen �ber Eigenschaften der drei Dateien getroffen.
Die erste print-Anweisung enth�lt als Parameter einen Dateitestoperator (siehe dazu auch die Syntax von Seite print). In der Anweisung wird durch Anwendung von -s $Textdatei die Gr��e der Datei ermittelt und an der entsprechenden Stelle ausgegeben.
Im zweiten Befehl, einem Aufruf von Seite printf, wird mit -M $Textdatei ermittelt, seit wie viel Tagen die Datei nicht mehr ge�ndert wurde. Auch dieser Wert wird ausgegeben. Da -M eine Gleitkommazahl zur�ckgibt, wird die Ausgabe mit Hilfe der printf-Funktion auf drei Nachkommastellen gek�rzt.
In den nachfolgenden beiden print-Befehlen sehen Sie eine typische Konstruktion, wie Dateitestoperatoren, die nur "wahr" oder "falsch" zur�ckgeben, angewendet werden. Zum Einsatz kommt in beiden F�llen eine Seite einfache Entweder-Oder-Abfrage. Im ersten Fall wird mit dem Dateitestoperator -d abgefragt, ob die unbekannte Datei ohne Endung ein Verzeichnis ist oder eine normale Datei. Im zweiten Fall wird mit -e abgefragt, ob die Perl-Datei existiert oder nicht.
Das letzte Beispiel zeigt, wie ein Dateitestoperator in eine Seite nachgestellte bedingte Anweisung eingebaut wird - ebenfalls eine typische Konstruktion. Das Beispiel ermittelt mit Hilfe des Dateitestoperators -z, ob die Datei leer ist oder nicht. Wenn sie nicht leer ist, wird eine Meldung ausgegeben, dass es Zugriffe gegeben hat.

Beachten Sie:

Dateitestoperatoren k�nnen auch vergebene Datei-Handles anstelle von direkten Dateiangaben verarbeiten. Wenn Sie beispielsweise mit open(FILE,"<datei.htm") eine Datei zum Lesen �ffnen, k�nnen Sie mit -s FILE die Gr��e der Datei ermitteln.

Tabelle der Dateitestoperatoren:

Syntax Bemerkung Bedeutung Beispiel Erl�uterung
-A   ermittelt, wie lange seit Programmstart auf eine Datei zugegriffen wurde. R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl. printf("%.3f Tage
  Zugriffszeit",-A $Datei);
F�r die vom Script verarbeitete Datei $Datei wird ausgegeben, wie lange darauf zugegriffen wurde.
-B   ermittelt, ob es sich um eine Bin�rdatei handelt. binmode(FILE) if -B FILE; Wenn die Datei des File-Handles FILE eine Bin�rdatei ist, wird binmode aufgerufen.
-b Unix-
spezifisch
ermittelt, ob eine Ger�tedatei blockorientiert ist. exit(-1) unless -b "/cdrom"; Wenn "/cdrom" kein blockorientiertes Ger�t ist, wird das Script beendet.
-C   ermittelt die Inode-Ver�nderungszeit einer Datei seit Programmstart.
R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl.
if(-C $Datei > 10) {
  print "Warnung!"; }
Wenn die Inode-Zeit der Datei $Datei gr��er als 10 Tage ist, wird "Warnung!" ausgegeben.
-c Unix-
spezifisch
ermittelt, ob eine Ger�tedatei zeichenorientiert ist. exit(-1) if -c "/cdrom"; Wenn "/cdrom" zeichenorientiert ist, wird das Script beendet.
-d   ermittelt, ob es sich um ein Verzeichnis handelt. chdir("texte") if -d "texte"; Wenn "texte" ein Verzeichnis ist, wird in das Verzeichnis gewechselt.
-e   ermittelt, ob ein Verzeichniseintrag existiert. print "text.txt existiert!"
  if -e "text.txt";
Wenn die Datei "text.txt" existiert, wird dies ausgegeben.
-f   ermittelt, ob es sich um eine normale Datei (keine Ger�tedatei, kein Verzeichnis usw.) handelt. Verarbeiten() if -f "text.txt"; Wenn die Datei "text.txt" eine normale Datei ist, wird eine Subroutine aufgerufen.
-g Unix-
spezifisch
ermittelt, ob bei einer Datei das setgid-Bit (set-group-ID-Bit) gesetzt ist.
chmod 02771, "daten"
  unless -g "daten";
Wenn das Verzeichnis "daten" kein setgid-Bit besitzt, werden die entsprechenden Rechte gesetzt.
-k Unix-
spezifisch
ermittelt, ob bei einer Datei das Sticky-Bit gesetzt ist (Bit z.B. f�r die Anweisung, Code eines Programms nach dessen Ausf�hrung im Speicher zu behalten, weil es voraussichtlich �fter ausgef�hrt wird). print "test.pl ist sticky"
  if -k "test.pl";
Wenn die Datei "text.pl" das Sticky-Bit gesetzt hat, wird dies ausgegeben.
-l Unix-
spezifisch
ermittelt, ob es sich um einen symbolischen Link handelt. print readlink("text.txt")
  if -l "text.txt";
Wenn die Datei "text.txt" ein symbolischer Link ist, wird dessen Wert ausgegeben.
-M   ermittelt, wie lange eine Datei seit Programmstart nicht ge�ndert wurde. R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl. printf("seit %.3f Tagen
  nicht modifiziert",
  -M $Datei);
F�r die Datei $Datei wird ausgegeben, wie lange sie nicht mehr ver�ndert wurde.
-o/-O Unix-
spezifisch
ermittelt, ob die Datei der effektiven UID (-o) bzw. der realen UID (-O) geh�rt.
Verarbeiten()
  if -o "text.txt";
Wenn die Datei "text.txt" der effektiven UID geh�rt, wird eine Subroutine aufgerufen.
-r/-R Unix-
spezifisch
ermittelt, ob die effektive UID/GID (-r) bzw. die reale UID/GID (-R) Leserecht f�r die Datei besitzt. open(FILE,"<text.txt")
  if -r "text.txt";
Wenn die effektive UID/GID Leserecht auf die Datei "text.txt" hat, wird sie zum Lesen ge�ffnet.
-p Unix-
spezifisch
ermittelt, ob es sich um eine named pipe (FIFO) handelt. print "pipe" if -p "myprog"; Wenn die Datei "myprog" eine named pipe ist, wird dies ausgegeben.
-S Unix-
spezifisch
ermittelt, ob die Datei eine Socket-Datei ist (wird von Client-Server-Prozessen, die auf einem Rechner laufen, als Schnittstelle benutzt). next if -S $_; Wenn die aktuelle Datei innerhalb einer angenommenen Schleife zur �berpr�fung von allen Verzeichniseintr�gen ein Socket ist, startet der n�chste Schleifendurchgang.
-s   ermittelt die Dateigr��e in Bytes. print -s $DirEintrag
  if not -d $DirEintrag;
Wenn der Verzeichniseintrag $DirEintrag kein Verzeichnis ist, wird die Dateigr��e ausgegeben.
-T   ermittelt, ob es sich um eine Textdatei handelt. Verarbeiten() if -T "text.txt"; Wenn die Datei "text.txt" eine Textdatei ist, wird eine Subroutine aufgerufen.
-t Unix-
spezifisch
ermittelt, ob der Verzeichniseintrag ein tty, d.h. ein angeschlossenes Ger�t (Terminal) ist (unter Unix werden Peripherieger�te als Dateien behandelt). print "STDIN ist tty"
  if -t "STDIN";
Wenn der Standardeingabekanal tty ist, wird dies ausgegeben.
-u Unix-
spezifisch
ermittelt, ob bei einer Datei das setuid-Bit (Set-User-ID-Bit) gesetzt ist. die "kein uid-Bit"
  if not -u "text.pl";
Wenn bei der Datei "text.pl" kein setuid-Bit gesetzt ist, wird das Script mit einer Fehlermeldung beendet.
-w/-W Unix-
spezifisch
ermittelt, ob die effektive UID/GID (-w) bzw. die reale UID/GID (-W) Schreibrecht f�r die Datei besitzt.
open(FILE,">text.txt")
  if -W "text.txt";
Wenn die reale UID/GID f�r die Datei "text.txt" Schreibrechte besitzt, wird sie zum Schreiben ge�ffnet.
-x/-X Unix-
spezifisch
ermittelt, ob die effektive UID/GID (-x) bzw. die reale UID/GID (-X) Ausf�hrrecht f�r die Datei besitzt. system("myprog")
  if -x "myprog";
Wenn die effektive UID/GID f�r die Datei "myprog" Rechte zum Ausf�hren der Datei besitzt, wird sie �ber einen system-Aufruf ausgef�hrt.
-z   ermittelt, ob eine Datei leer ist, also 0 Bytes hat. open(FILE,"<text.txt")
  if not -z "text.txt"
Wenn die Datei "text.txt" nicht leer ist, wird sie zum Lesen ge�ffnet.
 

nach obennach unten

chdir - Verzeichnis wechseln

Macht ein Verzeichnis zum aktuellen Arbeitsverzeichnis. So ist es m�glich, nach dem Wechseln in ein Verzeichnis dort abgelegte Dateien zu �ffnen, ohne sich um Pfadnamen k�mmern zu m�ssen.

Erwartet als Parameter:
1. den nach oben Pfadnamen des Verzeichnisses, zu dem gewechselt werden soll. Es kann sich um eine relative oder eine absolute Pfadangabe handeln.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wechselt die Funktion in das Verzeichnis, das in der Umgebungsvariablen HOME gespeichert ist.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

chdir("/usr/txt/rfc");
open(DATEI,"<rfc1867.txt");
my @Zeilen = <DATEI>;
close(DATEI);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body><pre>\n";
print "@Zeilen";
print "</pre></body></html>\n";

Erl�uterung:

Das Beispielscript wechselt mit chdir in das Verzeichnis /usr/local/txt/rfc, also in ein bestimmtes Unterverzeichnis ab Wurzelverzeichnis gerechnet. Dort wird dann eine Datei ge�ffnet, eingelesen und wieder geschlossen (Erl�uterungen zu diesen Befehlen siehe Seite open). Anschlie�end wird HTML-Code erzeugt. Dabei werden die Zeilen der eingelesenen Datei ausgegeben.

nach obennach unten

chmod - Datei-/Verzeichnisrechte �ndern

Setzt die Rechte zum Lesen, Schreiben und Ausf�hren einer oder mehrerer Dateien f�r Benutzer, Benutzergruppe und Rest der Welt (Unix-spezifisch).

Erwartet als Parameter:
1. eine nach oben Rechteangabe. Der Wert muss numerisch oktal �bergeben werden, nicht als Zeichenkette!
2. bis n. eine oder mehrere Dateien/Verzeichnisse, f�r die diese Rechte gesetzt werden sollen, wenn n�tig mit nach oben Pfadnamen.

Gibt die Anzahl der vorgenommenen �nderungen zur�ck.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Verzeichnis = "/usr/web/docs/cgi-bin";
chdir($Verzeichnis);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";

my @Dateien = glob("*.pl");
my $Datei;
foreach $Datei (@Dateien) {
  chmod(0755,$Datei);
  print "$Datei auf 0755 gesetzt<br>\n";
}
print "</body></html>\n";

Erl�uterung:

Das Beispiel setzt alle Perl-Dateien eines CGI-Verzeichnisses auf die Rechte 0755 - auf vielen Servern eine sinnvolle Einstellung f�r CGI-Scripts. Zu diesem Zweck werden alle Dateien des Verzeichnisses $Verzeichnis (dem CGI-Verzeichnis) mit nach unten glob ausgew�hlt. Die Liste @Dateien, in der die ausgew�hlten Dateien anschlie�end stehen, wird daraufhin in einer Seite foreach-Schleife abgearbeitet. Mit chmod(0755,$Datei) wird die jeweils aktuelle Perl-Datei mit den gew�nschten Rechten versehen. Zur Kontrolle gibt das Beispielscript aus, welche Dateien ge�ndert wurden.

nach obennach unten

chown - Besitzer und Besitzergruppe von Dateien �ndern

Jede Datei unter Unix hat einen Eigent�mer, der durch zwei Zahlen identifiziert wird: die pers�nliche User-ID (UID) und die zugeh�rige Gruppen-ID (GID). Die Funktion �ndert Besitzer und Besitzergruppe von einer oder mehreren Dateien. Auf den meisten Unix-Systemen ist dazu eine Root-Kennung erforderlich.

Erwartet als Parameter:
1. die numerische UID (User-ID des Besitzers),
2. die numerische GID (Gruppen-ID der Besitzergruppe),
3. bis n. eine oder mehrere Dateien, f�r die die angegebenen UID und GID gelten sollen, wenn n�tig mit nach oben Pfadnamen.

Gibt die Anzahl der vorgenommenen �nderungen zur�ck.

Beispiel:

#!/usr/bin/perl -w

use strict;

chdir("/usr/data/web/htdocs");
opendir(DIR, "/usr/data/web/htdocs") || die "$!\n";
my @Eintraege = readdir(DIR);
closedir(DIR);
foreach (@Eintraege) {
 chown(1034, 518, $_) if -f $_;
}

Erl�uterung:

Das Beispiel �ndert f�r alle regul�ren Dateien des angenommenen Verzeichnisses /usr/data/web/htdocs die Besitzerschaft auf den Benutzer mit der User-ID 1034 und der Gruppen-ID 518.

nach obennach unten

chroot - Wurzelverzeichnis f�r Pfadnamen �ndern

Bestimmt ein neues Verzeichnis als "virtuelles" Wurzelverzeichnis. Absolute Pfadangaben, die mit / beginnen, beziehen sich anschlie�end darauf. Auf den meisten Unix-Systemen ist zum Anwenden dieser Funktion eine Root-Kennung erforderlich.

Erwartet als Parameter:
1. den nach oben Pfadnamen des Verzeichnisses, das zum Wurzelverzeichnis werden soll. Es kann sich um eine relative oder eine absolute Pfadangabe handeln.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wird der Inhalt der Seite vordefinierten Variablen $_ als Pfadnamen des gew�nschten Verzeichnisses interpretiert.

Beispiel:

#!/usr/bin/perl -w

use strict;

chroot("/usr/local/web/domains/eidideldum");
chdir("/");
opendir(DIR, ".");
my @Eintraege = readdir(DIR);
closedir(DIR);

foreach(@Eintraege) {
  print "$_\n";
}

Erl�uterung:

Das Beispiel setzt den Pfad /usr/local/web/domains/eidideldum als neues Wurzelverzeichnis. Anschlie�end wechselt das Script mit nach oben chdir in das neue Wurzelverzeichnis ("/"). Zur Kontrolle liest das Script das aktuelle Verzeichnis (".") ein und listet die eingelesenen Verzeichniseintr�ge anschlie�end auf (Erl�uterungen zu diesen Befehlen siehe Seite opendir).

nach obennach unten

glob - Dateien mit Wildcards ausw�hlen

W�hlt aus einem Verzeichnis alle Dateien aus, die einem bestimmten Dateinamenmuster entsprechen. Das ist wesentlich einfacher als das Operieren mit den Funktionen Seite opendir, Seite readdir und Seite closedir. Der Nachteil von glob ist allerdings, dass diese Funktion eine Unix-Shell startet, um an ihr Ergebnis zu kommen. Die Funktion ist daher nur auf Unix-Systemen verf�gbar, und ausf�hrbar ist sie auch nur, wenn das Script ausreichende Rechte zum Starten der Shell besitzt. Es gibt jedoch bei den Seite Standardmodulen f�r Dateiverwaltung ein Modul, das den glob-Algorithmus komplett in Perl ausf�hrt.

Erwartet als Parameter:
1. Das Dateinamenmuster, wenn n�tig mit nach oben Pfadangabe.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my @HTML_Dateien = glob("/usr/web/docroot/*.htm");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
foreach (@HTML_Dateien) {
  print "$_<br>\n";
}
print "</body></html>\n";

Erl�uterung:

Das Beispielscript w�hlt im Verzeichnis /usr/web/docroot alle Dateien aus, die auf htm enden. Zur Kontrolle gibt das Script HTML-Code mit allen eingelesenen Dateien aus.

Die folgende Tabelle enth�lt Beispiele f�r Dateimuster:

Dateimuster Bedeutung
* w�hlt alle Dateien und Verzeichnisse aus, auch solche, die keine Endung haben.
*.* w�hlt alle Dateien und Verzeichnisse aus, die aus Namen und Endung bestehen.
*.gif w�hlt alle GIF-Dateien aus
index.* w�hlt alle Dateien aus, die index als Namen haben, unabh�ngig von der Endung.
???.* w�hlt alle Dateien aus, deren Name aus drei Zeichen besteht, unabh�ngig von der Endung.
????.txt w�hlt alle TXT-Dateien aus, deren Name aus vier Zeichen besteht.
 

nach obennach unten

link - neue Datei als Link auf vorhandene erzeugen

Die link-Funktion, die dem Unix-Befehl ln entspricht, legt aus Sicht des Benutzers eine Kopie einer Datei an. Es handelt sich jedoch intern nach wie vor nur um eine einzige Datei, die lediglich nunmehr unter zwei verschiedenen Namen (und gegebenenfalls an zwei Stellen im Verzeichnisbaum) zu finden ist. Wird die Datei an einer dieser Stellen, an denen sie repr�sentiert wird, ge�ndert, gilt die �nderung auch f�r die anderen Stellen, an denen die Datei repr�sentiert wird. Wird eine der Dateien gel�scht (z.B. mit nach unten unlink), so bleiben andere Repr�sentationen der Datei davon unber�hrt. Erst wenn die letzte Repr�sentation der Datei gel�scht ist, ist die Datei endg�ltig gel�scht.

Erwartet als Parameter:
1. die bereits existierende Datei, von der eine neue Repr�sentation erzeugt werden soll, wenn n�tig mit nach oben Pfadangabe,
2. die neu zu erzeugende Repr�sentation der Datei, wenn n�tig mit Pfadangabe.

Gibt 1 zur�ck, wenn die Operation erfolgreich war, und 0, wenn sie nicht erfolgreich war (z.B. weil im Zielverzeichnis kein Schreibrecht besteht).

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Erfolg = link("single.txt","../double.txt");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
$Erfolg ? print "Erfolg" : print "kein Erfolg";
print "</body></html>\n";

Erl�uterung:

Das Beispiel wendet die Funktion link an, um von der Datei single.txt im aktuellen Verzeichnis eine neue Repr�sentation zu erzeugen, die im Verzeichnis oberhalb (../) unter dem Namen double.txt erscheint. Der R�ckgabewert wird in dem Skalar $Erfolg gespeichert. Zur Kontrolle erzeugt das Beispiel HTML-Code und gibt dabei mit Hilfe einer Seite einfachen Entweder-Oder-Abfrage den Erfolgsstatus der Operation an.

nach obennach unten

lstat - Eigenschaften einer Link-Datei

Diese Funktion leistet das gleiche wie die Funktion nach unten stat. N�here Beschreibung und Beispiel siehe dort.

Im Unterschied zu stat ermittelt lstat nicht die Eigenschaften einer Datei, sondern die einer Dateiverkn�pfung, eines so genannten symbolischen Links. Wenn es sich nicht um eine Repr�sentation einer Datei handelt (also wenn die Datei nur einmal im Verzeichnisbaum erscheint), wird beim Aufruf von lstat intern automatisch ein normaler Aufruf von stat gestartet. lstat erfasst also im Gegensatz zu stat auch Dateirepr�sentationen und wird deshalb in der Praxis eher eingesetzt als stat.

nach obennach unten

mkdir - Verzeichnis erstellen

Legt ein neues Verzeichnis an und erm�glicht es, f�r das neue Verzeichnis die Rechte f�r Lesen, Schreiben und Ausf�hren zu vergeben (nur bei Unix-Systemen wirksam).

Erwartet als Parameter:
1. den Namen des neuen Verzeichnisses, wenn n�tig nach oben Pfadnamen.
2. eine nach oben Rechteangabe. Der Wert muss numerisch oktal �bergeben werden, nicht als Zeichenkette! Zum Ermitteln der gew�nschten Oktalzahl k�nnen Sie den Seite Unix-Dateirechte-Setzer bei den kleinen Helferlein verwenden.
Auf Systemen, die keine Unix-Rechteverwaltung kennen, also z.B. unter Windows, ist der zweite Parameter bedeutungslos.

Gibt 1 bzw. TRUE zur�ck, wenn die Operation erfolgreich war, und 0 bzw. FALSE, wenn das Anlegen des Verzeichnisses nicht m�glich war (z.B. weil in dem Verzeichnis, in dem das Unterverzeichnis angelegt werden sollte, kein Schreibrecht besteht). Der genaue Fehlertext kann in diesem Fall �ber die Seite vordefinierte Variable $! ermittelt werden.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my @Verzeichnisbaum = (
"texte",
"texte/briefe",
"texte/rechnungen",
"texte/rechnungen/alt",
"texte/rechnungen/neu",
"grafiken",
"grafiken/fotos",
"grafiken/fotos/fremde",
"grafiken/cliparts",
);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
chdir("/temp");
foreach(@Verzeichnisbaum) {
  mkdir($_,0777);
  print "Unterverzeichnis <strong>$_</strong> angelegt<br>\n";
}
print "</body></html>\n";

Erl�uterung:

Das Beispiel definiert eine Liste namens @Verzeichnisbaum. Darin werden Eintr�ge gespeichert, die eine anzulegende Unterverzeichnisstruktur darstellen. Weiter unten im Beispielscript wird diese Liste in einer Seite foreach-Schleife abgearbeitet. Dabei wird jedes einzelne der Verzeichnisse mit mkdir angelegt. Das jeweils aktuelle Verzeichnis der Liste steht innerhalb der Schleife in $_. Als zweiter Parameter wird die Oktalzahl 0777 �bergeben. Damit erhalten alle Benutzer der Verzeichnisse alle Rechte. Das Beispielscript erzeugt HTML-Code und gibt f�r jedes angelegte Verzeichnis einen entsprechenden Satz aus.

nach obennach unten

readlink - Wert einer Link-Datei auslesen

Liest den Wert einer symbolischen Link-Datei aus. Das sind Link-Dateien, die z.B. mit Hilfe von nach unten symlink erzeugt wurden.

Erwartet als Parameter:
1. den Namen der symbolischen Link-Datei, wenn n�tig mit nach oben Pfadnamen.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wird der Inhalt der Seite vordefinierten Variablen $_ verwendet.

Gibt den vollst�ndigen Pfad der Datei aus, auf die sich die Link-Datei bezieht. Im Fehlerfall gibt die Funktion undef zur�ck und schreibt den Fehlertext in die vordefinierte Variable $!. Auf Betriebssystemen, die keine symbolischen Links kennen, also z.B. unter Windows, produziert der Aufruf dieser Funktion einen schweren Fehler.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl

use strict;
use CGI::Carp qw(fatalsToBrowser);

chdir("/tmp");
symlink("/usr/local/webdocs/index.htm","webindex.sym");
my $Inhalt = readlink("webindex.sym");

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "Inhalt der symbolischen Datei: $Inhalt\n";
print "</body></html>\n";

Erl�uterung:

Das Beispielscript wechselt zun�chst mit nach oben chdir ins Verzeichnis /tmp. Dort legt es mit symlink eine symbolische Link-Datei namens webindex.sym an, die ein symbolischer Link zu der Datei /usr/local/webdocs/index.htm ist. Mit readlink wird anschlie�end der Wert ausgelesen, der der symbolischen Datei zugeordnet ist. Zur Kontrolle erzeugt das Beispielscript HTML-Code. Dabei wird der webindex.sym zugeordnete Pfadnamen zur verlinkten Datei ausgegeben.

nach obennach unten

rename - Datei/Verzeichnis umbenennen

Erwartet als Parameter:
1. den Namen der umzubenennenden Datei oder des umzubenennenden Verzeichnisses, wenn n�tig mit nach oben Pfadnamen.
2. den neuen Namen der Datei oder des Verzeichnisses, wenn n�tig mit neuem Pfadnamen.
Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses, wird die Datei in das andere Verzeichnis verschoben. Es ist jedoch mit dieser Funktion nicht m�glich, als ersten und zweiten Parameter zwei unterschiedliche Verzeichnisse anzugeben, um das erste Verzeichnis in das zweite zu verschieben.
Es ist au�erdem nicht m�glich, Dateien auf eine andere Partition zu verschieben. Abhilfe schafft hierbei die Funktion move aus dem Seite Standardmodul File::Copy.

Gibt true zur�ck, wenn die Operation erfolgreich war, ansonsten false.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

chdir("/htmldocs");
opendir(DIR,".");
my @Eintraege = readdir(DIR);
closedir(DIR);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
my $Eintrag;
my $Name;
my $NeuerEintrag;
foreach $Eintrag (@Eintraege) {
 if($Eintrag =~ /(.+)\.htm/) {
   $Name = $1;
   $NeuerEintrag = $Name.".html";
   rename($Eintrag,$NeuerEintrag);
   print "$Eintrag in $NeuerEintrag umbenannt<br>\n";
 }
}
print "</body></html>\n";

Erl�uterung:

Das Beispiel bewirkt, dass alle Dateien eines Verzeichnisses, die auf die Endung .htm enden, in gleichnamige Dateien mit der Endung .html umbenannt werden.
Das Script wechselt zun�chst mit nach oben chdir in das Verzeichnis /htmldocs. Anschlie�end liest es dieses aktuelle Verzeichnis (".") in die Liste @Eintraege ein (Erl�uterungen zu diesen Befehlen siehe Seite opendir). Das Beispielscript erstellt HTML-Code. Dabei werden die Eintr�ge des eingelesenen Verzeichnisses in einer Seite foreach-Schleife abgearbeitet. Bei jedem Eintrag wird gepr�ft, ob es sich um eine Datei mit der Endung .htm handelt. Wenn ja, wird der "Vorname" der Datei in $Name gespeichert und ein neuer Dateiname aus dem Wert von $Name und der Endung .html definiert. Anschlie�end wird die Funktion rename aufgerufen. Dabei wird der bisherige Eintrag, also eine Datei .htm, in den neuen Eintrag, also eine Datei mit gleichem Vornamen, nur mit der Endung .html, umbenannt. Zur Kontrolle listet das Script alle Umbenennungen auf.

nach obennach unten

rmdir - Verzeichnis l�schen

Erwartet als Parameter:
1. den Namen des zu l�schenden Verzeichnisses, wenn n�tig den nach oben Pfadnamen.
Das Verzeichnis muss leer sein, andernfalls kann es mit dieser Funktion nicht gel�scht werden. Nicht leere Verzeichnisse lassen sich mit der Funktion rmtree aus dem Seite Standardmodul File::Path l�schen.

Gibt 1 zur�ck, wenn das Verzeichnis gel�scht wurde. Falls ein Fehler aufgetreten ist, wird 0 zur�ckgegeben, und in der Seite vordefinierten Variablen $! steht die Fehlermeldung.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Verzeichnis = $ENV{'QUERY_STRING'};
my $Ergebnis = rmdir($Verzeichnis);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
if($Ergebnis == 1) {
  print "$Verzeichnis gel&ouml;scht!";
}
else {
 print "$!";
}
print "</body></html>\n";

Erl�uterung:

Das Script erwartet einen �bergabeparameter, der beim Aufruf �ber einen URI hinter einem Fragezeichen notiert wird. Der �bergabeparameter besteht in der Pfadangabe des zu l�schenden Verzeichnisses. Beispiel:
/mydocs/texte/schrott.
Das Script versucht, das �bergebene Verzeichnis zu l�schen. Der R�ckgabewert des Versuchs wird in dem Skalar $Ergebnis gespeichert.
Anschlie�end erzeugt das Script HTML-Code. Dabei wird ausgegeben, ob das �bergebene Verzeichnis erfolgreich gel�scht wurde oder nicht. Wenn nicht, wird die erzeugte Fehlermeldung ausgegeben.

nach obennach unten

stat - Eigenschaften einer Datei ermitteln

Ermittelt diverse Eigenschaften einer Datei auf einmal in Listenform. Die meisten dieser Eigenschaften sind Unix-spezifisch. Einige Eigenschaften lassen sich zwar auch auf anderen Plattformen abfragen, doch dazu ist es eigentlich einfacher, die nach oben Dateitestoperatoren f�r Dateien/Verzeichnisse zu verwenden. Die Funktion stat l�sst sich im Gegensatz zu nach oben lstat nicht auf Dateirepr�sentanzen (symbolische links), sondern nur auf "Originale" von Dateien anwenden.

Erwartet als Parameter:
1. den Namen der gew�nschten Datei, wenn n�tig mit nach oben Pfadnamen. Alternativ kann auch der Name eines Datei-Handles �bergeben werden.

Gibt eine Liste mit mehreren Elementen zur�ck. Jedes Element enth�lt eine bestimmte ermittelte Datei-Eigenschaft.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Datei = "/usr/webperldoc/index.html";
my @Info = stat($Datei);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body><pre>\n";
print "<strong>Datei:</strong>                      $Datei\n";
print "<strong>Geraetenummer:</strong>              $Info[0]\n";
print "<strong>Inode-Nummer:</strong>               $Info[1]\n";
printf "<strong>Zugriffsrechte:</strong>             %o\n", $Info[2];
print "<strong>Anzahl Links auf Datei:</strong>     $Info[3]\n";
print "<strong>User-ID des Besitzers:</strong>      $Info[4]\n";
print "<strong>Gruppen-ID des Besitzers:</strong>   $Info[5]\n";
print "<strong>Raw-Geraetenummer:</strong>          $Info[6]\n";
print "<strong>Dateigroesse:</strong>               $Info[7]\n";
print "<strong>Letzte Zugriffszeit:</strong>        $Info[8]\n";
print "<strong>Letzte Aenderungsszeit:</strong>     $Info[9]\n";
print "<strong>Inode-Aenderungsszeit:</strong>      $Info[10]\n";
print "<strong>Ideale Blockgroesse:</strong>        $Info[11]\n";
print "<strong>Anzahl belegter Blocks:</strong>     $Info[12]\n";
print "</pre></body></html>\n";

Erl�uterung:

Das Beispiel ermittelt f�r eine bestimmte Datei (/usr/data/artikel.zip) mit stat die verf�gbaren Datei-Eigenschaften. Der R�ckgabewert der Funktion wird in einer Liste @Info gespeichert. Das Beispiel erzeugt HTML-Code und listet darin alle 13 Einzeleigenschaften, abrufbar �ber $Info[0] bis $Info[12], auf. Die folgende Tabelle enth�lt n�here Informationen �ber die einzelnen Eigenschaften.

Indexnr.: Erl�uterung:
[0] Ger�tenummer: die systemweit eindeutige Ger�tenummer des Dateisystems, auf dem sich die Datei befindet.
[1] Inode-Nummer: Die dateisystemweit eindeutige Nummer der Datei innerhalb des Dateisystems mit der Ger�tenummer aus [0].
[2] Dateityp/Zugriffsrechte: Der zur�ckgegebene Wert muss als Oktalzahl interpretiert werden (daher im obigen Beispiel auch die Ausgabe mit Seite printf als Oktalzahl). Die oktale Bewertung der Zahl zeigt zwar eine einzige Zahl, die jedoch aus zwei Teilen besteht. Die letzten drei Ziffern bedeuten die nach oben Rechteangaben zur Datei, und die Ziffern davor bedeuten den Dateityp. Die entsprechenden Nummern werden auf Unix-Systemen in der Datei sys/stat.h definiert.
[3] Anzahl Links auf Datei: Anzahl physikalisch existierender Repr�sentationen der Datei, also mindestens 1. Bei gesetzten Links, wie es in Perl z.B. mit der Funktion nach oben link m�glich ist, erh�ht sich die Anzahl.
[4] User-ID des Besitzers: Die Nummer des Datei-Eigent�mers.
[5] Gruppen-ID des Besitzers: Die Nummer der Gruppe, zu der der Datei-Eigent�mer geh�rt.
[6] Raw-Ger�tenummer: Nur bei Ger�tedateien interessant.
[7] Dateigr��e: Die logische Gr��e der Datei in Bytes.
[8] Letzte Zugriffszeit: Zeitstempel des letzten lesenden oder schreibenden Zugriffs auf die Datei. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick des letzten Zugriffs.
[9] Letzte �nderungszeit: Zeitstempel des letzten schreibenden Zugriffs auf die Datei. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick des letzten Zugriffs.
[10] Inode-�nderungszeit: Zeitstempel des letzten Zugriffs auf die Datei, der eine �nderung der Inode-Nummer bewirkte. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick der letzten Inode-�nderung.
[11] Ideale Blockgr��e: Die optimale Anzahl Bytes zum blockweisen Lesen oder Schreiben der Datei - in Perl mit Funktionen wie Seite sysread oder Seite syswrite.
[12] Anzahl belegter Bl�cke: Die Anzahl der vom Betriebssystem benutzen Speicherbl�cke, um die Datei zu speichern.
 

nach obennach unten

symlink - neue Datei als symbolischen Link auf vorhandene erzeugen

Erzeugt einen symbolischen Link auf eine anderswo gespeicherte Datei. Der erzeugte Verzeichniseintrag erscheint jedoch im Gegensatz zu einem Eintrag, der mit nach oben link erzeugt wurde, nicht als tats�chliche Repr�sentation der anderen Datei, sondern nur als Verkn�pfung zu der anderen Datei (Unix-spezifisch).

Erwartet als Parameter:
1. die existierende Datei, zu der ein symbolischer Link erzeugt werden soll, wenn n�tig mit nach oben Pfadangabe,
2. die neu zu erzeugende, symbolische Link-Datei, wenn n�tig mit Pfadangabe.

Gibt 1 zur�ck, wenn die Operation erfolgreich war, und 0, wenn sie nicht erfolgreich war. Auf Betriebssystemen, die keine symbolischen Links kennen, kann diese Funktion zu einem schweren Fehler beim Ausf�hren des Scripts f�hren!

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $symlink_exists = eval { symlink("",""); 1 };
if($symlink_exists) {
  symlink("/usr/local/people/stefan.htm","/usr/local/links/stefan.link");
}

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
opendir(DIR, "/u/web/teamon/temp");
my @Dateien = readdir(DIR);
closedir(DIR);
foreach (@Dateien) {
  print "$_<br>\n";
}
print "</body></html>\n";

Erl�uterung:

Das Beispiel �berpr�ft zun�chst mit Hilfe der Funktion Seite eval, ob auf dem Betriebssystem, unter dem das Script ausgef�hrt wird, symbolische Links m�glich sind. Benutzen Sie zu einer solchen �berpr�fung den Befehl wie im Beispiel notiert. In dem R�ckgabewert, der im Beispiel in dem Skalar $symlink_exists gespeichert wird, steht der Wert 1 (true), falls symbolische Links m�glich sind. Mit der Konstruktion if($symlink_exists) ist dann die bedingte Ausf�hrung von symlink m�glich. Im Beispiel wird eine Link-Datei namens stefan.link erzeugt, die auf die Originaldatei stefan.htm in einem anderen Verzeichnis zeigt. Das Beispiel liest zur Kontrolle das Verzeichnis, in dem die symbolische Link-Datei erzeugt wurde, ein (Erl�uterungen zu diesen Befehlen siehe Seite opendir) und gibt entsprechenden HTML-Code aus.

nach obennach unten

umask - Umask des laufenden Prozesses �ndern

Diese Funktion ist nur f�r Unix-Systeme relevant. Wenn unter Unix eine neue Datei geschrieben wird, werden die dabei vergebenen Zugriffsrechte durch die Umask des aktuell laufenden Prozesses (z.B. das laufende Perl-Script, das die Datei erzeugt) beeinflusst. Durch Aufruf der Funktion umask k�nnen Sie die Umask des laufenden Prozesses �ndern und dadurch deren Wirkung auf die Zugriffsrechte neu erzeugter Dateien beeinflussen.

Erwartet als Parameter:
1. eine Bitmaske f�r eine nach oben Rechteangabe. Der Wert muss oktal �bergeben werden. Jedes gesetzte Bit in der Bitmaske bewirkt, dass das entsprechende Bit in einer vom laufenden Prozess erzeugten Datei ausgeschaltet wird.

Gibt den alten Umask-Wert zur�ck.

Beispiel:

#!/usr/bin/perl -w

use strict;

use Fcntl;
sysopen(DATEI,"/usr/web/temp/test.txt", O_CREAT,0666);
umask(0077);
sysopen(DATEI2,"/usr/web/temp/test2.txt", O_CREAT,0666);
open(LS,"ls -la /usr/web/temp |");
print while(<LS>);
close(DATEI);
close(DATEI2);
close(LS);

Erl�uterung:

Das Beispiel erzeugt mit zwei Aufrufen von Seite sysopen zwei Dateien namens test.txt und test2.txt. Bei beiden Dateien wird als gew�nschte Rechteangabe 0666 angegeben. Zwischen den beiden Aufrufen von sysopen steht jedoch ein Aufruf von umask. Der Funktion wird dabei 077 als Oktalzahl mit f�hrender 0 �bergeben. Dies bewirkt, dass bei der Datei test2.txt die tats�chlichen Zugriffsrechte auf 0600 gesetzt werden. Zur Kontrolle gibt das Script das Ergebnis des Unix-Kommandos ls f�r das Verzeichnis, in dem die beiden Dateien erzeugt wurden, aus.

Die Wirkungsweise von umask l�sst sich besser verstehen, wenn man das Bitmuster der Oktalzahl aufschl�sselt und mit der Zeichenkettenschreibweise von Zugriffsrechten vergleicht.
Das Bitmuster der Oktalzahl 077 lautet: 000111111 (eine 7 ist 111 bin�r!).
Die Zeichenkettenschreibweise von 0666 lautet: rw-rw-rw-.
Es stehen sich also 9 Bits und 9 Zeichen gegen�ber. Jedes gesetzte Bit (1) der Oktalzahl setzt das analoge Zeichen an der gleichen Stelle auf -, sofern dort vorher r, w oder x stand.
Das Bitmuster 000111111 bewirkt also bei einem Recht rw-rw-rw-, dass alle hinteren 6 Zeichen auf - gesetzt werden, sodass rw------- herauskommt (was wiederum oktal 0600 entspricht).

nach obennach unten

unlink - Dateien l�schen

L�scht eine oder mehrere Dateien gleichzeitig. Verzeichnisse k�nnen mit diesem Befehl nicht gel�scht werden, dazu steht die Funktion nach oben rmdir zur Verf�gung.

Erwartet als Parameter:
1. eine Liste von Dateien, die gel�scht werden sollen.

Gibt die Anzahl der erfolgreich gel�schten Dateien zur�ck.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

chdir("/tmp");
opendir(DIR,".");
my @Eintraege = readdir(DIR);
closedir(DIR);
my $Anzahl = 0;
foreach (@Eintraege) {
 unless( -d $_) {
   $Anzahl+= unlink($_);
 }
}
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "$Anzahl Dateien entfernt!\n";
print "</body></html>\n";

Erl�uterung:

Mit nach oben chdir wechselt das Beispielscript zun�chst in das Verzeichnis, in dem etwas gel�scht werden soll. Anschlie�end wird das Verzeichnis mit Seite opendir, Seite readdir und Seite closedir eingelesen. Die Verzeichniseintr�ge stehen anschlie�end in der Liste @Eintraege. In einer Seite foreach-Schleife wird die Liste sodann abgearbeitet. Mit unless( -d $_) wird abgefragt, ob der aktuelle Eintrag kein Verzeichnis ist. Wenn das der Fall ist, wird der Eintrag, also eine Datei, mit unlink gel�scht. Beim erfolgreichen L�schen wird die Variable $Anzahl um 1 erh�ht. Am Ende gibt das Script HTML-Code mit der Anzahl der gel�schten Dateien aus.

nach obennach unten

utime - Zeitstempel von Dateien/Verzeichnissen �ndern

�ndert den Zeitstempel f�r den letzten Lesezugriff und den letzten Schreibzugriff von einer oder mehreren Dateien.

Erwartet als Parameter:
1. Eine Zeitangabe f�r den letzten Lesezugriff. Es muss sich um eine Sekundenangabe seit dem 1.1.1970 handeln, so wie ihn beispielsweise die Funktion Seite time zur�ckgibt.
2. Eine Zeitangabe f�r den letzten Schreibzugriff. Auch dabei muss es sich um eine Sekundenangabe seit dem 1.1.1970 handeln.
3. eine Liste von Dateien, deren Zeitstempel ge�ndert werden soll.

Gibt die Anzahl der erfolgreich "ber�hrten" Dateien zur�ck.

Beispiel eines vollst�ndigen CGI-Scripts in Perl:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Datei = $ENV{'QUERY_STRING'};
my $Jetzt = time();
utime($Jetzt,$Jetzt,$Datei);

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Test-Ausgabe</title></head><body>\n";
print "Zeitstempel von $Datei wurde aktualisiert!\n";
print "</body></html>\n";

Erl�uterung:

Das Script aktualisiert den Zeitstempel einer Datei. Beim Aufruf erwartet es einen �bergabeparameter, der beim URI hinter einem Fragezeichen notiert wird. Der �bergabeparameter besteht in der Pfadangabe einer Datei, deren Zeitstempel aktualisiert werden soll. Beispiel:
http://localhost/cgi-bin/test.pl?/mydocs/texte/wichtig.txt.
Den �bergebenen Parameter speichert das Script in dem Skalar $Datei. Um den aktuellen Zeitpunkt zu ermitteln, wird die Funktion time aufgerufen. Sie liefert die Anzahl der Sekunden seit dem 1.1.1970 zur�ck, also genau die Form, die utime erwartet. Der R�ckgabewert wird in $Jetzt gespeichert. Nun kann das Script die utime-Funktion aufrufen und ihr die gew�nschten Parameter �bergeben. Wenn Sie mehr als eine Datei auf einmal verarbeiten m�chten, geben Sie alle gew�nschten Dateien durch Kommata getrennt an.
Anschlie�end erzeugt das Script HTML-Code. Dabei wird das "Ber�hren" der Datei best�tigt.

Beachten Sie:

Nicht alle Betriebssysteme unterscheiden wie Unix zwei verschiedene Zeitstempel. Unter Windows beispielsweise gibt es keinen Zeitstempel f�r den letzten Lesezugriff, nur f�r den letzten Schreibzugriff. �bergeben Sie utime dennoch immer beide Parameter. Unter Windows wird dann nur der eine vorhandene Zeitstempel ge�ndert.

 nach oben
weiter Seite Funktionen f�r Betriebssystemaufrufe
zur�ck Seite Funktionen f�r Ein-/Ausgabe und Lesen/Schreiben von Daten
 

© 2007 Seite Impressum