Effacer une ligne d'un fichier sans lire tout le fichier ...

Description

BUT : J'ai une base de donnée de plusieurs 10 aine de mégaoctets stockée dans un fichier texte. Je veux éffacer un enregistrement dedans, je regarde sur le net, mais la seul solution que je trouve , c'est de lire le fichier et de le réécrire avec une ligne en moin , celle qu'on voulait éffacer. Vu la taille de mon fichier ce n'est pas viable . Je crée donc une fonction qui 'méfface une ou plusieurs lignes d'un fichier sans pour autant lire le fichier complet (au passage je récupérere la valeur des lignes )

Source / Exemple :


define("ERREUR",-1);

function LirePuisEffacer($CheminFichier,$TamponSQL){
 if($fp=fopen($CheminFichier,'r+')){
           $requetes = "";
           $lines    = array();
           $i=0;
           // on lit  $TamponSQL requetes
            Do {
                    // récupérere les enregistrements
                    $requete= fgets($fp, 4096);
                    $taille =strlen($requete);

                    // on vérifie que la ligne lu ne vaut pas espace

                   if (ltrim($requete)<>"")
                   {
                      $i++;
                      $lines[] = $requete;
                   }
                      $fin=feof($fp);
                    // génére un tampon contenant 'taille' espaces
                     $tampon="";
                     for ($j = 0; $j < ($taille); $j++) {
                         $tampon .=" ";
                         // il serai mieux de mettre un Backspace, mais je ne connais pas
                         // l'équivalent PHP et chr(8) ne convient pas
                         }

                      // positionne le curseur en début de ligne
                      fseek($fp,-$taille,SEEK_CUR);

                      if ( $i<>$TamponSQL){
                          // remplace la ligne en cours par des espaces (saut de ligne inclus)
                          fputs($fp,$tampon,$taille);
                     } else {
                          // remplace la ligne en cours par des espaces mais garde le retour à la ligne
                          fputs($fp,$tampon,($taille-2));
                          fputs($fp,"\r\n");
                     }

                         // faire gaffe au cas ou c vide

                } while ( $i<$TamponSQL and $fin<>1);
          fclose($fp);
          if ($fin == 1) $lines =ERREUR;
          } else {$lines=ERREUR;}
          return $lines;
 }

Conclusion :


BUG : Les enregistrements ne sont pas réellement éffacé du fichier mais seulement remplacer par des espaces, ce qui fait que tout éffacement de 1 ou plusieurs enregistrement laissera UNE ligne d'espace,
BUG corrrigé : les fichiers vides n'était pas gérer , maintenant c'est bon

TODO list : remplacer les espaces par des backspaces, cependant le probléme, c'esut que CHR(8) qui code pour les backspace ne marche pas dans ce cas la.
Si vous avez une idée.

http://geiienforce.free.fr

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.