Dateierstellung mit den Dateisystem-Funktionen
Hugo Egon Balder
- php
Hallo Forum!
Ich beschäftige mich gerade etwas mit den Dateisystem-Funktionen von php.
Dort lese ich im Manual bei der Funktion fopen Folgendes:
Eine Liste der möglichen Modi von fopen() mittels mode [...] und dort dann bei mehreren Modi den Satz "Existiert die Datei nicht, versuche, diese zu erzeugen."
Meine Frage: Wenn ich eine leere Datei example.txt einfach nur erzeugen möchte, also _weder_ eine Lese-, _noch_ eine Schreiberechtigung setzen möchte, was bietet sich da als Alternative zu fopen() an?
Ich hatte gehofft, dass ich im Manual unter all den Funktonen so etwas wie "erstellt eine Datei ohne Inhalt" finde, leider ergebnislos.
Heiß das, ich _muss_ mit fopen() arbeiten, wenn ich eine leere txt-Datei erstellen möchte, auch, wenn ich zu diesem Zeitpznkt weder etwas Lesen, noch etwas Schreiben möchte?
Mit bestem Dank im Voraus für jede Hilfe und
mfG
Hugo Egon Balder
Heiß das, ich _muss_ mit fopen() arbeiten, wenn ich eine leere txt-Datei erstellen möchte, auch, wenn ich zu diesem Zeitpznkt weder etwas Lesen, noch etwas Schreiben möchte?
Nein. Zumindest wenn Dein PHP unter Linux läuft und das Ausführen von System-Befehlen nicht unterbunden ist kannst Du leere Dateien auch mit [touch](http://www.manpagez.com/man/1/touch/) $DATEI
oder $DATEI=[mktemp](http://www.manpagez.com/man/1/mktemp/)
erzeugen. (Achte auf die Backticks!)
Eine weitere Möglichkeit ist System::mktemp - Freilich musst Du dazu ein Modul nachinstallieren.
Wobei mir absolut nicht klar ist, was genau Dich an fopen() stört.
Heiß das, ich _muss_ mit fopen() arbeiten, wenn ich eine leere txt-Datei erstellen möchte, auch, wenn ich zu diesem Zeitpznkt weder etwas Lesen, noch etwas Schreiben möchte?
[2]
file_put_contents($FILE,'');
tut auch, was Du willst.
Tach!
Wenn ich eine leere Datei example.txt einfach nur erzeugen möchte, also _weder_ eine Lese-, _noch_ eine Schreiberechtigung setzen möchte, was bietet sich da als Alternative zu fopen() an?
Eine Datei ohne Inhalt und ohne Berechtigungen? Das scheint mit ein ziemlich spezieller Spezialfall zu sein. Zumindest eine Leseberechtigung (und Schreibberechtigung) für den Besitzer wäre vermutlich nicht ganz verkehrt, obwohl der sich diese Berechtigungen auch nachträglich setzen kannst, solange die Datei dem Benutzer gehört.
Ich hatte gehofft, dass ich im Manual unter all den Funktonen so etwas wie "erstellt eine Datei ohne Inhalt" finde, leider ergebnislos.
Schreibend/erstellend öffnen und schließen wäre zu einfach? Ansonsten nimmt man für so etwas touch, was es auch als PHP-Funktion gibt. Und es gibt auch noch tmpfile() und tempnam() für das temporäre oder dauerhafte Erstellen von Dateien im temporären Systemverzeichnis, wenn du nur eine solche benötigst.
Heiß das, ich _muss_ mit fopen() arbeiten, wenn ich eine leere txt-Datei erstellen möchte, auch, wenn ich zu diesem Zeitpznkt weder etwas Lesen, noch etwas Schreiben möchte?
Nein, aber du kannst.
dedlfix.
Hello HEB,
Dort lese ich im Manual bei der Funktion fopen Folgendes:
Eine Liste der möglichen Modi von fopen() mittels mode [...] und dort dann bei mehreren Modi den Satz "Existiert die Datei nicht, versuche, diese zu erzeugen."
Meine Frage: Wenn ich eine leere Datei example.txt einfach nur erzeugen möchte, also _weder_ eine Lese-, _noch_ eine Schreiberechtigung setzen möchte, was bietet sich da als Alternative zu fopen() an?
Es ist immer besser, die Datei mit fopen() zu erzeugen, weil in einem Multiusersystem die Race Conditions beachtet werden müssen. fopen() ist in der Lage, die Prüfung auf Existenz und die angewiesene Aufgabe (öffnen, erzeugen, ...) in einem atomistisch gekapsleten Prozess abzuwickeln. Das geht mit keiner anderen Funktion.
Auch touch() leistet das nicht. Angenommen, Du prüfst im Zeitpunkt Z1, ob die Datei schon vorhanden ist, um sie dann zu Z5 anzulegen mit touch(), dann kann dies immer noch zu Z2, Z3, Z4 ein anderer Prozess bereits erledigt haben. Touch() würde dann das Filedatum der jetzt bereits vorhandenen Datei verändern. Das _kann_, je nach Aufgaben der Programme, zu Fehlern führen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Dort lese ich im Manual bei der Funktion fopen Folgendes:
Eine Liste der möglichen Modi von fopen() mittels mode [...] und dort dann bei mehreren Modi den Satz "Existiert die Datei nicht, versuche, diese zu erzeugen."
Meine Frage: Wenn ich eine leere Datei example.txt einfach nur erzeugen möchte, also _weder_ eine Lese-, _noch_ eine Schreiberechtigung setzen möchte, was bietet sich da als Alternative zu fopen() an?
Du (und die beiden anderen) verwechselst die Lese- und Schreibberechtigung, kurz: die Zugriffsrechte, mit den Arbeitsmodi von fopen().
Unter Lese- und Schreibrechten versteht man, welcher Benutzer des Systems eine Datei auslesen oder beschreiben kann. Damit hat fopen() nichts zu tun, das ist Sache von chmod(). chmod() kann (unter anderem) eine Datei vor dem versehentlichen Beschreiben schützen oder verhindern, dass Fremde eine Datei auslesen. Das versteht man unter Rechten bzw. der Berechtigung.
Der Parameter mode von fopen() hingegen bestimmt lediglich, wie du selbst _jetzt gerade_ auf die Datei zugreifen möchtest. Wenn du beispielsweise lediglich etwas aus der Datei lesen möchtest, benutzt du "r" als Modus.
Mit dem _Setzen_ von Lese- und Schreibrechten hat das nichts zu tun! Du musst fopen() aber einen Arbeitsmodus übergeben, weil es ja durchaus sein kann, dass eine Datei schreibgeschützt ist. Mit einem lesenden fopen() kannst du diese Datei öffnen, ein schreibendes fopen() wird hingegen fehlschlagen. Es kann andersrum auch sein, dass eine Datei lesegeschützt ist, die kannst du dann nur mit schreibendem fopen() öffnen.
Also: Bitte Zugriffsrechte und Öffnungsmodus nicht verwechseln!
Ich hatte gehofft, dass ich im Manual unter all den Funktonen so etwas wie "erstellt eine Datei ohne Inhalt" finde, leider ergebnislos.
Dateien werden immer ohne Inhalt, d.h. mit der Länge 0 erstellt.
Überlege doch mal: Was sollte denn in einer niegelnagelneuen Datei drinstehen? Das Betriebsystem kann sich doch nicht ein paar Megabyte aus den Fingern saugen und dir vor die Füße kippen. Eine neue Datei ist _immer_ leer.
Heiß das, ich _muss_ mit fopen() arbeiten, wenn ich eine leere txt-Datei erstellen möchte, auch, wenn ich zu diesem Zeitpznkt weder etwas Lesen, noch etwas Schreiben möchte?
Du kannst, aber du musst nicht. Du kannst mit fopen() eine leere Datei erstellen; betrachte das Erstellen einfach als schreibenden Zugriff und wähle entsprechend w, a, x oder c als fopen()-Modus, je nachdem, wie du mit einer möglicherweise existierenden Datei desselben Namens umgehen möchtest.
Falls es dir aber wirklich nur darum geht, dass eine Datei überhaupt vorhanden ist, verwende statt fopen() besser den einfacheren Aufruf von touch().
Mit fopen() geöffnete Dateien müssen eigentlich mit fclose() wieder geschlossen werden, zusätzlich musst du, wie oben beschrieben, den Arbeitsmodus wählen. Bei touch() ist das alles nicht nötig, der Aufruf ist also mit weniger Aufwand verbunden.
Andererseits sorgt touch() nicht dafür, dass die Datei leer ist, sowas erreichst du nur mit fopen() und mode="w". Sollte die Datei also bereits existieren und beschrieben sein, könntest du irgendwann mit Datenmüll dastehen, weil du immer davon ausgegangen bist, dass die Datei leer ist.
Nochmal kurz:
Hello,
Nochmal kurz:
- Datei soll existieren und _muss_ leer sein: fopen(), mode="w".
- Datei soll existieren und kann leer oder auch schon beschrieben sein: touch().
Das ist aber eine sehr gefährliche Verkürzung!
vorher || nachher || mode
-----------------+------------------++---------------------+-------------------------++------
Datei | || | ||
existiert | existiert nicht || soll leer sein | soll Inhalt behalten ||
x | || x | || w
| x || x | || x
x (muss) | || | x || r
x (kann) | || | x || c
Wenn eine Datei nur zum Lesen oder zum Anhängen an das Ende geöffnet werden aoll || a
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg