der Neue: Namen einer .txt vortaufend nummerieren

Hallo* :)

Ich habe eine Frage wozu ich die Lösung nicht finden kann.

Ich möchte Forumalsdaten in einer .txt Datei speichern, das funktioniert auch

Mit
$datei_name = 'angebot.txt';
lege ich den Namen fest

Mit
$fp = fopen($datei_name, "a+");
öffne ich die Datei schreibend

Mit
fwrite($fp, $daten .$shunt14. "" .$last14. "" .$anzahl14. "" .$shunt15. "" .$last15. "" .$anzahl15 ."\n");
schreibe ich Daten in die Datei

Und mit
fclose($fp);
schleiße ich die .txt dann wieder.

Jetzt heißt die Datei ja immer angebot.txt und wird immer wieder bei Nutzung überschrieben.
Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden. Wenn die angebot1.txt schon vorhaben dann halt die anbeot2.txt usw. usw.

Das mit den .txt Datei in PHP anlegen konnte ich noch googlen, verstehen und umsetzten. Leider finde ich nichts zu meiner Frage. Mir fehlen hier die Grundlagen.

Mag jemand helfen ?

Danke und Gruß
der Neue

  1. hi,

    nimm doch lieber file_get_contents() und file_put_contents().

    überlege, ob du nicht lieber alle daten in eine textfile packen willst, mit serialize() und unserialize() kanns du ein Array entsprechend "verpacken".

    oder du nennst deine dateien gleich 1000, 1001 u.s.w., das spart dir lästige strinoperationen. oder du "merkst" dir die anzahl der bereits gespeicherten dateien in einem extra file.

    mit glob(*.txt) könntest du vermutlich auch zusammen mit count() die anzahl der existierenden txt-files in einem ordner herausbekommen.

    mfg

    tami

    1. mit glob(*.txt) könntest du vermutlich auch zusammen mit count() die anzahl der existierenden txt-files in einem ordner herausbekommen.

      Ungünstig. Kann zu Konflikten führen:

      Das Skript holt für Benutzer A die Anzahl der Dateien.
      Das Skript holt 2ms später für Benutzer B die Anzahl der Dateien.
      Danach schreibt das Skript für  Benutzer A die Inhalte und dann schreibt das Skript für Benutzer B die Inhalte in die gleiche Datei.

      Ich würde deshalb dazu neigen entweder gleich eine Datenbank zu bemühen oder aber tempnam() zu verwenden. Um die Dateien dann fortlaufend zu haben genügt wohl die Sortierung nach der Erstellungszeit - die man mit filectime() heraus bekommen kann.

      Jörg Reinholz

  2. Tach!

    Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden. Wenn die angebot1.txt schon vorhaben dann halt die anbeot2.txt usw. usw.

    file_exists() prüft auf vorhandene Dateien. Eine freie Nummer zu finden geht mit einer Schleife, in der a) eine neue Nummer gebildet wird, b) daraus ein Dateiname gebildet wird und c) geprüft wird, ob solch eine Datei existiert. Die Suche dauert jedoch mit jeder neuen Date immer länger. Bei nur wenigen Dateien ist das kein Problem, wenn aber viele erwartet werden, könnte es zu einem werden. Bei sehr vielen wäre jedoch eine andere Art der Datenhaltung vermutlich sinnvoller (sprich Datenbank).

    Leider finde ich nichts zu meiner Frage. Mir fehlen hier die Grundlagen.

    Mit solchen kämest du zum Ziel. Stringverküpfungen und Schleifen sowie die genannte Funktion, mehr braucht es nicht. Für Grundlagenwissen lautet das Suchstichwort: PHP-Tutorial.

    dedlfix.

  3. Noch eine andere Variante wären Dateinamen mit aktuellem Datum und Zeit. Das wäre zwar nicht mehr fortlaufend, aber du kannst es trotzdem nach der Zeit sortieren wenn du die Datumsanteile in der richtigen Reihenfolge setzt und du musst nicht mit Schleifen arbeiten.

  4. hi,

    Ich würde aber gerne per PHP prüfen ob es schon eine angebot.txt gibt, wenn ja soll eine angebot1.txt angelegt werden.

    Siehe Dein Thema: Fortlaufende Nummer erzeugen

    Hotti

  5. hi,

    <?php  
    $textToSave = "abc";  
    $fileNr = 1;  
    while (file_exists("ausgabe" . $fileNr . ".txt")) {  
    	$fileNr += 1;  
    }  
    file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);  
      
    
    

    mfg

    tami

    1. <?php

      $textToSave = "abc";
      $fileNr = 1;
      while (file_exists("ausgabe" . $fileNr . ".txt")) {
      $fileNr += 1;
      }
      file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);

      
      >   
        
      Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?  
      Ja, diese Lücke wird dann gefüllt.  
      Mit fortlaufender Nummerierung hat das nichts zu tun.  
        
      Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.
      
      1. hi,

        <?php

        $textToSave = "abc";
        $fileNr = 1;
        while (file_exists("ausgabe" . $fileNr . ".txt")) {
        $fileNr += 1;
        }
        file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);

        
        > >   
        >   
        > Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?  
        > Ja, diese Lücke wird dann gefüllt.  
        > Mit fortlaufender Nummerierung hat das nichts zu tun.  
        >   
        > Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.  
          
        Ja, ist doch klar, dass das "nur" ein (ausbaufähiger) Ansatz (!) ist. Du kannst genausogut die aktuelle Nummer mit  
          
        ~~~php
          
        file_put_contents("fileNr.ser",serialize($fileNr));  
        
        

        abspeichern.
        Und mit

          
        $lastFileNr = unserialize(file_get_contents("fileNr.ser"));  
        
        

        einlesen.

        Du kannst auch die Filenamen alle auslesen, die die Nummer zwischen "ausgabe" und ".txt" rauslesen, indem Du zB. "ausgabe" und ".txt" in den Filenamen löscht und so eine Methode oder Funktion bauen, die Dir angibt, welche Nummer bei einer eventuell fortlaufenden Nummerierung fehlen. Und damit dann entsprechend umgehen.

        mfg

        tami

      2. hi,

        <?php

        $textToSave = "abc";
        $fileNr = 1;
        while (file_exists("ausgabe" . $fileNr . ".txt")) {
        $fileNr += 1;
        }
        file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);

        
        > >   
        >   
        > Und was passiert, wenn eine Datei gelöscht wurde in der Reihe?  
        > Ja, diese Lücke wird dann gefüllt.  
        > Mit fortlaufender Nummerierung hat das nichts zu tun.  
        >   
        > Das gilt im Übrigen auch dann, wenn z.B. die ersten 50, 100, 200 Dateien mal als Backup weggespeichert und gelöscht werden.  
          
        ~~~php
          
        <?php  
        $textToSave = "abc";  
        $fileNr = 1;  
        foreach(glob("ausgabe*.txt") as $fileName) {  
        	$fileNameNr = str_replace(array("ausgabe",".txt"), "", $fileName);  
        	if($fileNameNr > $fileNr) {  
        		$fileNr = $fileNameNr;  
        	}  
        }  
        $fileNr += 1;  
        file_put_contents("ausgabe" . $fileNr . ".txt", $textToSave);  
        
        

        mfg

        tami