Die Dateifunktionen ermöglichen einen Zugriff auf das Dateisystem des Serverbetriebssystems. Daher kann der Betrieb von PHP ein Sicherheitsrisiko sein. Möglichkeiten auf das Dateisystem des Clients zuzugreifen gibt es jedoch keine (serverseitige Skriptsprache!).
Es lisse sich sogar - wenn auch umständlich - eine Datenbank ersetzen, indem man die Daten in eine Datei schreibt und bei bedarf diese Datei läd und ausliest.
Anwendungsfelder:
- Logdateien schreiben
- Formulardaten ablegen
- Textbausteine, die dynamisch in Webseiten eingebaut werden sollen speichern
- Zählerstand speichern
- ...
Dateien lesen und schreiben
$fp soll ein Dateihandler sein, der mit fopen() erzeugt wurde.
Lesen und Schreiben von Dateien
Befehl
|
Beispiel
|
Funktion
|
fopen
|
$fp = fopen($path, $modus);
|
öffnet die Datei $path in einem bestimmten Modus.
Modi im ASCII-Format:
r = nur lesen
r+ = lesen und schreiben
w = nur schreiben
w+ = lesen, schreiben, löschen und ggf. Datei anlegen
a = schreiben, Dateizeiger am Ende und ggf. Datei anlegen
a+ = wie a mit lesen
Modi Binär: wie oben mit vorangestelltem b (br+...)
|
fclose
|
fclose($fp);
|
Schliesst die Datei wieder
|
fgetc
|
fgetc($fp)
|
liest ein einzelnes Zeichen ein. Ist das Ende der Datei erreicht wird FALSE zurückgegeben
|
feof
|
feof($fp)
|
Überprüft Dateiende, wenn ja TRUE
|
fgets
|
fgets($fp, $maxlength)
|
Liest eine Zeile aus der Datei (\n)
|
fgetss
|
fgetss($fp, $maxlength)
|
Liest eine Zeile aus der Datei und entfernt HTML Tags
|
fgetcsv
|
$arr = fgetcsv($fp, $len, $delim)
|
Liest eine Zeile aus der Datei, zerlegt sie anhand von $delim und gibt das Ergebnis als Array aus
|
fputs
|
|
Schreibt an die Stelle des Dateizeigers
|
file
|
file(,filename")
|
Liest eine ganze Datei in ein Array ein
|
fread
|
fread($fp, $length)
|
Liest $length Byte aus einer Datei ein
|
fseek
|
fseek($fp, $offset)
|
Setzt den Dateizeiger $offset vor oder zurück
|
ftell
|
ftell($ftell)
|
Aktuelle Position des Dateizeigers
|
fwrite
|
fwrite($fp, $str)
|
Schreibt $str in die Datei
|
readfile
|
$size = readfile(,filename")
|
Liest eine Datei ein und gibt sie direkt im Browser aus. Zurück kommt die Anzahl der Bytes oder FALSE.
|
rename
|
rename(,alt","neu")
|
Benennt eine Datei um
|
rewind
|
rewind($fp)
|
Setzt den Dateizeiger auf den Anfang
|
unlink
|
unlink(,filename")
|
Löscht eine Datei
|
copy
|
copy(,filename", "$path")
|
Kopiert eine Datei an die Stelle $path (der auch einen neuen Namen enthalten kann) True/False
(Evtl. Warnungen mit @copy unterdrücken)
|
Beispiel öffnen und zeilenweises Auslesen einer Datei:
<?
$path = "/usr/local/apache/htdocs/daten.txt";
$modus = ,w";
if ($fp = fopen($path, $modus)) {
while ($str = fgets($fp, 100)) {
echo $str."<br>";
}
}
else {
echo ,Datei konnte nicht geöffnet werden";
if (fclose($fp))
echo ,Datei geschlossen";
}
?>
Dateiverzeichnis und Zugriffsrechte
Dateien
Funktion
|
Beispiel
|
Beschreibung
|
basename
|
basename($path)
|
Gibt den Dateinamen eines Pfades zurück
|
diskfreespace
|
diskfreespace($dir)
|
Freier Speicherplatz in einem Verzeichnis
|
file_exists
|
file_exists(,filename")
|
Prüft ob Datei vorhanden
|
fileatime
|
fileatime(,filename")
|
Datum des letzten Zugriffs
|
filectime
|
filectime(,filename")
|
Datum der Erstellung
|
filemtime
|
filemtime(,filename")
|
Datum der letzten Änderung
|
fileowner
|
fileowner(,filename")
|
Besitzer der Datei
|
fileperms
|
fileperms(,filename")
|
Zugriffstechte der Datei oder des Verzeichnis
|
filesize
|
filesize(,filename")
|
Größe der Datei
|
filetype
|
filetype(,filename")
|
Dateityp
|
is_dir
|
is_dir(,filename")
|
Prüft ob es ein Verzeichnis ist
|
is_executable
|
is_executable(,filename")
|
Prüft ob ausführbar
|
is_file
|
is_file(,filename")
|
|
is_readable
|
is_readable(,filename")
|
|
is_writeable
|
is_writeable(,filename")
|
|
stat
|
$arr = stat()
|
Informationen über eine Datei im Array
|
Zugriffsrechte einer Datei ermitteln:
$erg = fileperms($path);
echo decoct($erg);
Die Zugriffsrechte werden als Integer übermittelt, daher muss aus ihnen erst mit decoct() eine Oktalzahl gemacht werden. Das Ergebnis könnte dann zum Beispiel 100644 sein. Die ,100" bedeutet dass es sich um eine Datei handelt, die ,644" erschließt sich aus der nachfolgenden Tabelle:
Zugriffsrechte
Besitzer
|
Gruppe
|
Andere
|
read
|
write
|
delete
|
read
|
write
|
delete
|
read
|
write
|
delete
|
400
|
200
|
100
|
40
|
20
|
10
|
4
|
2
|
1
|
700
|
70
|
7
|
(rwx/rwx/rwx = 777)
|
stat() gibt Informationen über eine Datei im Array aus:
<?
$path = ,/usr/local/apache/htdocs/daten.bin";
$arr = stat($path);
foreach ($arr as $key=>$elem) {
echo ,$key=>$elem<br>";
}
?>
Array ist folgendermassen aufgebaut:
stat()-Array
Feld
|
Inhalt
|
0
|
Gerät
|
1
|
inode
|
2
|
inode protection mode
|
3
|
Anzahl der Links
|
4
|
Besitzer der Datei
|
5
|
Benutzergruppe des Besitzers
|
6
|
Geräte-Typ (nur bei inode Geräten)
|
7
|
Größe in Byte
|
8
|
Letzter Zugriff
|
9
|
Letzte Änderung
|
10
|
Erstellungsdatum
|
11
|
Cluster Größe für das Dateisystem I/O
|
12
|
Anzahl der zugeordneten Cluster
|
Funktionen für das Verzeichnissystem
Verzeichnisse
Funktion
|
Beispiel
|
Beschreibung
|
chdir
|
chdir($dir)
|
Wechselt das Verzeichnis
|
closedir
|
closedir($dir)
|
Schließt ein geöffnetes Verzeichnis
|
dir
|
dir($dir)
|
Öffnet ein Verzeichnis und erstellt eine Klasse
|
dirname
|
dirname($path)
|
Gibt das Verzeichnis zurück
|
mkdir
|
mkdir($path, $mode)
|
Erstellt ein Verzeichnis
|
opendir
|
opendir($dir)
|
Öffnet ein Verzeichnis
|
readdir
|
readdir($dir)
|
Liest einen Eintrag aus einem Verzeichnis
|
rewinddir
|
rewinddir($dir)
|
Springt zum ersten Verzeichniseintrag
|
mrdir
|
mrdir($dir)
|
Löscht ein Verzeichnis
|
chgrp
|
chgrp($filename,$group)
|
Ändert die Benutzergruppe einer Datei
|
chmod
|
chmode($filename,$mode)
|
Ändert die Zugriffsrechte einer Datei
|
chown
|
chgrp($filename,$user)
|
Ändert den Besitzer einer Datei
|
touch
|
chgrp($filename,$time)
|
Setzt das Datum der letzten Veränderung
|
umask
|
umask($mask)
|
Ändert die aktuelle, als Integer angegebene Rechtemaske einer Datei.
|
$obj = dir($path) öffnet ein Verzeichnis und erstellt eine Klasse zur weiteren Verwendung.
Beispiel: Ausgeben des freien Speicherplatzes und des Inhalts von htdocs
<?
$path = ,/usr/local/apache/htdocs/";
$folder = dir($path);
$free = diskfreespace($path);
echo $free." Bytes frei";
while ($datei = $folder->read()) {
echo ,\n$datei<br>";
}
$folder->close();
?>
Mit -> wird eine Methode der Klasse $folder aufgerufen. Folgende Methoden stehen zur Verfügung:
handle() = erzeugt ein Handler
path() = Gibt den Pfad des Verzeichnisses zurück
read() = liest den nächsten Eintrag im Verzeichnis oder FALSE
rewind() = setzt den Dateizeiger zurück
close() = schliesst das Verzeichnis
Dateiupload
Formular für Dateiauswahl
<form name="form1" method="post" enctype="multipart/form-data" target="_self">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="hidden" name="mat_in" value="ja">
<input type="file" size=40 name="pfad">
<input type="submit" name="submit" value="hochladen">
</form>
Das Formular legt eine Dateigrößenbeschränkung fest (2MB). Größere Dateien werden nach dem Upload abgelehnt. Den Uploadvorgang selbst kann man nicht unterbinden, da der Browser die Daten in einer Anfrage sendet.
Der input Typ ,file" bietet die Auswahlbox.
Hochladen der Datei
Die hochgeladenen Dateien werden in einem temporären Verzeichnis des Servers gespeichert. Vorn dort aus werden sie dann an die Stelle kopiert, wo sie später sein sollen.
copy($tempname,"upload_folder/$filename");
Informationen über das hochgeladene File bekommt man durch das Array $_FILES ($HTTP_POST_FILES ???)
Beispiel (pfad ist der name des Dateiauswahlbuttons im HTML-Dokument):
$pfad = $_POST['pfad'];
$datei_name = $_FILES['pfad']['name'];
$temp_name = $_FILES['pfad']['tmp_name'];
$max_file_size = $_POST['MAX_FILE_SIZE'];
$groesse = round($_FILES['pfad']['size']/10)/100;
$typ = $_FILES['pfad']['type'];
# Ordner anlegen
$isDir = @mkdir($ServerHome.$vvzid,777);
# Ziel definieren
$destination = $ServerHome.$vvzid."/".$datei_name_neu;
# Datei verschieben
$move = move_uploaded_file ( $temp_name, $destination);