Sneap: Probleme beim schreiben einer logfile.txt

Hallo Leute,
ich hab ein paar Probleme beim schreiben eines Logfiles.
Also ich weiß das mit a das file geöffnet wird und der Zeiger ans Ende gesetzt wird. Nur wie kann ich das File leeren und dann den Modus a behlaten das alles immer hintereinander geschreiben wird?

  
//Logfile öffnen  
if($Logfile == true) $Log = fopen(dirname(__FILE__).'/'.$Logfilename,'a');  
  
// Zum leeren  
  
  
// Text1 in die Datei schreiben  
if($Logfile == true) fwrite($Log, $Text1);  
  
// Text2 in die Datei schreiben  
if($Logfile == true) fwrite($Log, $Text2);  
  
//File schließen  
if($Logfile == true) fclose($Log);  

Danke schon mal für eure Hilfe.

Mfg Sneap

  1. Hallo,

    Also ich weiß das mit a das file geöffnet wird und der Zeiger ans Ende gesetzt wird. Nur wie kann ich das File leeren und dann den Modus a behlaten das alles immer hintereinander geschreiben wird?

    wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).

    So long,
     Martin

    --
    Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.
      (George Bernhard Shaw)
    1. Hallo,

      Also ich weiß das mit a das file geöffnet wird und der Zeiger ans Ende gesetzt wird. Nur wie kann ich das File leeren und dann den Modus a behlaten das alles immer hintereinander geschreiben wird?

      wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).

      So long,
      Martin

      Aber schreibt er dann nicht immer an den Anfang?
      Modus    Funktion               Dateizeiger    Anlegen?
      w        Schreiben              Anfang         Ja

      1. Hi,

        wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).
        Aber schreibt er dann nicht immer an den Anfang?

        ja, natürlich - das wolltest du doch. Oder was meintest du mit "leeren"?

        So long,
         Martin

        --
        Ich liebe Politiker auf Wahlplakaten.
        Sie sind tragbar, geräuschlos, und leicht wieder zu entfernen.
          (Loriot, deutscher Satiriker)
        1. Hi,

          wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).
          Aber schreibt er dann nicht immer an den Anfang?

          ja, natürlich - das wolltest du doch. Oder was meintest du mit "leeren"?

          So long,
          Martin

          Ja so ist schon ok, w ist genau richtig!

    2. Moin!

      Also ich weiß das mit a das file geöffnet wird und der Zeiger ans Ende gesetzt wird. Nur wie kann ich das File leeren und dann den Modus a behlaten das alles immer hintereinander geschreiben wird?

      wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).

      Das ist in Mehrbenutzersystemen sehr ungünstig, da durch das Öffnen die Datei weg ist, ohne dass irgendwelche Locks beachtet werden.

      Ich empfehle die Lektüre des Artikels Sperren von Dateien für eine umfassende Erklärung, wie man sowas sicher realisiert.

      - Sven Rautenberg

      1. Moin!

        Also ich weiß das mit a das file geöffnet wird und der Zeiger ans Ende gesetzt wird. Nur wie kann ich das File leeren und dann den Modus a behlaten das alles immer hintereinander geschreiben wird?

        wenn du die Datei beim Öffnen leeren willst, möchtest du also nicht den File Mode "a" (append) verwenden, sondern "w" (write). Dann wird der Dateiinhalt beim Öffnen zunächst gelöscht (d.h. die Dateilänge auf 0 gesetzt).

        Das ist in Mehrbenutzersystemen sehr ungünstig, da durch das Öffnen die Datei weg ist, ohne dass irgendwelche Locks beachtet werden.

        Ich empfehle die Lektüre des Artikels Sperren von Dateien für eine umfassende Erklärung, wie man sowas sicher realisiert.

        • Sven Rautenberg

        Ok verwendet jetzt flock ($Log, LOCK_EX);

  2. Liebe(r) Sneap,

    ich glaube, Du missverstehst da etwas. Wenn Du eine Datei mit "a" öffnest, dann wird der darin bereits vorhandene Inhalt nicht gelöscht, sondern beibehalten. Das hat nichts mit den Schreibzugriffen der Funktionen fwrite() oder fputs() zu tun. Eine solche Funktion schreibt grundsätzlich nacheinander neue Inhalte in die Datei, ohne irgendetwas Vorheriges dabei zu überschreiben!

    Der Moment des "Überschreibens" geschieht lediglich beim Öffnen einer bereits vorhandenen Datei mit dem Parameter "w", da hiermit eine Leere Datei erzeugt, und eventuell anstelle einer bereits vorhandenen Datei erstellt wird. Solange eine einmal geöffnete Datei beschrieben wird, geschehen darin keine Überschreibungen durch fwrite() oder fputs(), es sei denn, Du manipulierst unterwegs absichtlich den Dateizeiger.

    if($Logfile == true)

    Das kann man kürzer notieren: if ($Logfile)
    Wenn Du nicht explizit auf true prüfst (also andere Werte, die man so interpretieren könnte, nicht ausschließt), dann genügt die kürzere Variante. Wenn Du dagegen sicherstellen willst, dass der Inhalt von $Logfile einzig und allein true ist, dann brauchst Du drei Istgleichzeichen:
    if ($Logfile === true)

    Vergleiche hierzu folgendes:

    if ("" == true) echo ("true!");  
        /* Ein Leerstring kann als false interpretiert werden. */  
      
    if (0 == true) echo ("true!");  
        /* Eine Null kann als false interpretiert werden. */  
      
    if (array(1,2,3) == true) echo ("true!");  
        /* Das habe ich jetzt nicht getestet, da ich bei soetwas immer mit empty($meinArray) prüfe. */  
      
    if ("abc" === true) echo ("true!");  
        /* Der String ist nicht leer, kann also als true gewertet werden. Hier ergibt das Ergebnis aber false, da der String selbst eben kein true ist, sondern ein String. Die drei Leerzeichen wollen keinen String, sondern einen Bool'schen Wert haben, um true zu ermöglichen. */  
    
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Ok das mit Mdem Dateizeiger, hab ich echt falsch verstanden gehabt.

      Hab alle == Zeichen geändert in ===

  3. Moin!

    ich hab ein paar Probleme beim schreiben eines Logfiles.

    Benutze doch vielleicht lieber error_log() als Schreibfunktion für das Logfile (mit entsprechenden Parametern ausgestattet kannst du dort auch deine eigene Datei angeben), und unlink() zum Löschen der Datei (wobei das Löschen von Logfiles immer eine kritische Sache ist, weil das eigentlich nicht Aufgabe der Applikation sein sollte, sondern des Administrators).

    - Sven Rautenberg

    1. Moin!

      ich hab ein paar Probleme beim schreiben eines Logfiles.

      Benutze doch vielleicht lieber error_log() als Schreibfunktion für das Logfile (mit entsprechenden Parametern ausgestattet kannst du dort auch deine eigene Datei angeben), und unlink() zum Löschen der Datei (wobei das Löschen von Logfiles immer eine kritische Sache ist, weil das eigentlich nicht Aufgabe der Applikation sein sollte, sondern des Administrators).

      • Sven Rautenberg

      Naja mit der Methode komm ich schon ganz gut zur recht is ja eh nur n kleines Script so für mich.