Textzeile löschen in file

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
2886
amando  

Hallo,


ich versuche gerade eine Textzeile in einer Datei zu löschen. Das ganze gestaltet sich ja etwas schwierig, da ich ja String ersetzen kann, aber nicht löschen.

meine Idee war ja grundsätzlich, ich ersetzte den String was ich nicht will durch einen Zeilenumbruch und geb dann einfach die neuen Werte in die Datei.


Das Funktioniert soweit so gut, ich kann ein Symbol in der Datei suchen und es dann auch mit einem String ersetzen. Ob der String jetzt einfach leer ist oder ein Zeilenumbruch ist noch gar nicht das Problem


Das kommt erst beim reinschreiben.

Es wird ja alles korrekt geschrieben, die alten Zeilen werden überschrieben, was es auch tun soll, jedoch, wenn früher mehr Zeilen drin waren, löscht er die weiteren nicht raus.

Jemand eine Idee?

      if(sparam=="Del_Symbol")
        {

         int hdl=FileOpen(FileNamePair,FILE_READ|FILE_WRITE|FILE_ANSI|FILE_BIN);
         //Dann in Zeilen aufspalten:

         int sz=(int)FileSize(hdl);
         string _lines[],all=FileReadString(hdl,sz);

         int nL,i;

         ushort SepLine=StringGetCharacter("\n",0);                        //Dann in alle Zeilen aufspalten:
         nL=i=StringSplit(all,SepLine,_lines);
         //Dann Zeile suchen:

         while(i-->0)
           {
            if(StringFind(all,_Symbol,0))
              {
               StringReplace(all,_Symbol,"");
               Print("rausgelöscht");
               break;
              }
           }

         FileSeek(hdl,0,SEEK_SET);

         string _lines2[];
         int nP;
         nP=StringSplit(all,SepLine,_lines2);

         for(int j=0;j<=nL-1;j++)
            //forAlldn(nL,i)
           {
            if(StringLen(_lines2[j]+"\n")>0)
              {
               sz=StringLen(_lines2[j]+"\n");
               Print(sz);
               if(sz<3) continue; // Leerzeilen (auch die Letzte) auslassen

               FileWriteString(hdl,_lines2[j]+"\n",sz);
              }
           }
         Print(all);
         Print(nP);

         FileClose(hdl);
         PrintFormat("Die Daten sind aufgezeichnet, die Datei %s geschlossen",FileNamePair);

         OnDeinit(5);
         OnInit();
        }
Carl Schreiber
Moderator
9838
Carl Schreiber  

Statt:

FileSeek(hdl,0,SEEK_SET); // Zeile löschen oder auskommentieren

1.) FileHandle schließen und neu öffnen - mit der Gefahr, dass wenn beim Schreiben etwas schief läuft, der Inhalt verloren gehen könnte.

FileClose(hdl);
hdl=FileOpen(FileNamePair,FILE_WRITE|FILE_ANSI|FILE_BIN); // zum Schreiben eine leere Datei öffnen
      dann weiter wie im Programm, oder

2.) Handle schließen, TmpFile öffnen schreiben und org. Datei durch TmpFile ersetzen.

amando
2886
amando  
Carl Schreiber:

Statt:

1.) FileHandle schließen und neu öffnen - mit der Gefahr, dass wenn beim Schreiben etwas schief läuft, der Inhalt verloren gehen könnte.

      dann weiter wir im Programm, oder

2.) Handle schließen, TmpFile öffnen schreiben und org. Datei durch TmpFile ersetzen.

danke, das wars.

ich hab dann noch eine Frage, ein File löschen ist ja kein Problem, dafür gibts ja FileDelete

ich kann auch prüfen ob ein File existiert mit FileIsExist,

aber kann ich auch eines erzeugen?

muss ich da einfach ein 

hdl=FileOpen(FileNamePair,FILE_WRITE|FILE_ANSI|FILE_BIN);

und dann ein

FileWrite

machen?


danke

Carl Schreiber
Moderator
9838
Carl Schreiber  

Ja.

Wenn eine Datei im Modus FILE_BIN geschrieben wird (als Ganzes und nicht zeilenweise) müssen die jew. Zeilenenden \n oder \r\n selbst hinzugefügt werden!

Einloggen oder registrieren, um einen Kommentar zu schreiben