2016-05-11 8 views
1

Ich möchte die letzte Zeile einer Textdatei nach dem Lesen des Inhalts loswerden. Die Textdateien sind ziemlich groß, daher ist Lesen/Schreiben aufgrund von Leistungsproblemen keine Option.Abschneiden einer TXT-Datei durch 'x' Bytes in C#

Meine aktuelle Idee besteht darin, die Anzahl der Bytes zu berechnen, die die letzte Zeile darstellt (zusammen mit dem Übertragsrücklauf) und die Datei abzuschneiden.

Viele der Optionen, die ich gesehen habe mit "Filestream.setLength()" bezeichnet, und ich bin verwirrt, wie das funktioniert.

Würde das nicht nur die Datei zurückschreiben, sondern die Datei auf eine bestimmte Anzahl von Bytes stoppen, da die 'read' Funktion die Bytes einliest und sie in einen Puffer zurückschreibt? Oder könnte ich diese Funktion beim Lesen nutzen und die "Endposition" der Textdatei zurück verschieben, sagen wir 24 Bytes?

Dies ist der aktuelle Code I

try 
      { 
      //reading 
      using (StreamReader reader = new StreamReader(filePath)) 
      { 
        while (!reader.EndOfStream) 
        { 
         //gets the line 
         line = reader.ReadLine(); 
         if (!line.StartsWith("KeyWord", StringComparison.InvariantCultureIgnoreCase)) 
         { 
          //add number of lines 
          lineCount += 1; 
         } 
         else 
         { 
          //Finds the occurence of the first numbers in a string 
          string resultString = Regex.Match(line, @"\d+").Value; 
          long lastLineBytes = 0; 
          foreach (char c in line) 
          { 
           //each char takes up 1 byte 
           lastLineBytes++;   
          } 
          //carriage return 
          lastLineBytes += 2; 
          long fileLength = new FileInfo(filePath).Length; 
          Trace.WriteLine("The length of the file is " + fileLength); 

          //the size of the file - the last line 
          //truncate at this byte position, and we will be done. 
          long newFileLength = fileLength - lastLineBytes; 
          //Truncation goes ehre 
         } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
+0

https://msdn.microsoft.com/en-us/library/system.io.filestream.setlength.aspx – SLaks

+0

ich durch diese Zeilen lesen, und ich habe immer noch Schwierigkeiten zu verstehen, wie ich das in einem verwenden könnte trainieren. Hast du irgendwelche Beispiele dafür, die ich ausprobieren könnte? – Childishforlife

+1

Ich kann nicht versichern, aber ich glaube, dass das Ändern der Größe des Streams nur die Dateitabellenindizes ändert, um nur auf die linken Bytes zu zeigen, ein Testprogramm zu erstellen, das wirklich einfach ist und es zu testen, das ist Ihre beste Chance. – Gusman

Antwort

1

bin mit Wenn Sie die Größe des Stroms ändern es nur die Dateitabellenindizes neu schreiben wird nur auf das linke Bytes zu zeigen.

Für Ihre zweite Frage, ja, können Sie dies verwenden, um den Inhalt zu lesen (in diesem Beispiel nahm ich ASCII-Codierung, verwenden Sie den entsprechenden Encoder).

FileStream str = //get the stream 
byte[] data = new byte[str.Length]; 
str.Read(data, 0, data.Length); 
string theContent = System.Text.Encoding.ASCII.GetString(data); 
+0

ASCII ist keine sehr gute Annahme, weil es in diesem Zusammenhang nicht üblich ist und direkt gegenüber dem UTF - 8 steht, das der Code in der Frage verwendet. Siehe [StreamReader (Stream-Stream)] (https://msdn.microsoft.com/en-us/library/yhfzs7at (v = vs.110) .aspx). –

+1

@TomBlodget Das ist, wenn die Datei von .net erstellt wird. Auch ist jede Annahme schlecht, weil ich angegeben habe, es zum richtigen Encoder zu ändern, ASCII ist der historische Standard für Textdateien, ja, heutzutage ist es am üblichsten, UTF8 zu finden, aber alte Bräuche sind schwer zu ändern und ich programmiere seit 30 Jahren, so sind Textdateien für mich immer noch ASCII XD. – Gusman