Announcement

Collapse
No announcement yet.

FileStream: die letzten Bytes aus .txt lesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • FileStream: die letzten Bytes aus .txt lesen

    Heyho,

    ich arbeite an einem Textbearbeitungsprogramm welches eine .txt einlädt, die stetig wächst. Da ich nur die letzten Zeilen aus der Textdatei benötige, möchte ich die einzelnen Bytes mittels FileStream lesen.

    Mein bisheriger Code sieht wie folgt aus:
    [highlight=c#] FileStream fs = new FileStream(@path, FileMode.Open);
    string last_lines = "";
    int datei_ende = Convert.ToInt32(fs.Length);
    byte[] buffer = new byte[1024];

    fs.Read(buffer, datei_ende-1024, buffer.Length);
    for (int i = buffer.Length - 1; i >= 0; i--)
    {
    last_lines = Convert.ToChar(buffer[i]) + last_lines;
    }
    richTextBox1.Text = last_lines;[/highlight]

    Ich komme mit der FileStream-Read-Methode einfach nicht zu recht... Für mich bedeuten die Parameter folgendes:
    1. Paramter: In welchem byte[]-Array soll der Stream gespeichert werden?
    2. Parameter: Ab wann sollen die Bytes gelesen werden (offset)?
    3. Paramter: Wie viele Bytes sollen ab dem Offset gelesen werden?

    Ich hoffe, ich habe das so richtig verstanden. Ich verstehe nun einfach nicht, warum er nicht einfach die letzten 1024 Bytes aus dem Textdokument liest und in die Textbox schreibt.. Es tut sich einfach gar nichts.

    Was mich auch verwirrt: wenn ich nun nach dem Codesnippet etwas mit der Textbox machen möchte, wie zum Beispiel die Text-Eigenschaft "Hallo!", denn wird diese nicht mal angezeigt.. Wenn ich die Eigenschaft allerdings vor dem Codesnippet anwende, denn wird mir "Hallo!" angezeigt, obwohl die Textbox danach den Text doch eigentlich von der Variablen last_lines annehmen sollte. Das ist aber eher nebensächlich und nicht so relevant.

    Wenn ich den Stream wie folgt lese, denn funktioniert es auch. Jedoch liest er denn die ersten 1024 Bytes, und nicht die Letzten:

    Code:
    fs.Read(buffer, 0, buffer.Length);
    Was mache ich denn falsch? Könnt ihr mir weiter helfen?
    Zuletzt editiert von kogen; 23.11.2014, 16:40.

  • #2
    Der 2.te Parameter ist der Offset in buffer nicht im stream. In Stream wird immer relativ zu seiner Position gelesen und nicht jeder Stream unterstützt freies positionieren (ein Networkstream zum Beispiel). Ist aber bei einem FileStream nicht das Problem. Also entweder die Position per Position Property oder per Seek Methode passend setzen und dann Read aufrufen. Nach dem lesen der Bytes hat sich die Position übrigens um die entsprechende Anzahl Bytes verschoben was wenn du nochmehr lesen willst relevant wird. Am Ende des Stream aber eher irrelevant

    Comment


    • #3
      Hey Ralf,

      recht herzlichen Dank für deinen Lösungsvorschlag! Ich habe es nun mit der Position-Eigenschaft gemeistert! Funktioniert!

      [highlight=c#] .
      FileStream fs = new FileStream(@path, FileMode.Open);
      string last_lines = "";
      int datei_ende = Convert.ToInt32(fs.Length);
      byte[] buffer = new byte[1024];
      fs.Position = fs.Length - 1024;
      fs.Read(buffer, 0, buffer.Length);

      for (int i = buffer.Length-1; i >0; i--)
      {
      last_lines = Convert.ToChar(buffer[i]) + last_lines;
      }

      fs.Close();
      richTextBox1.Text = last_lines;[/highlight]

      Vielen vielen Dank!!

      Zur Ergänzung muss ich sagen, dass ich im Eingangspost die FileStreame-Close()-Methode vergessen habe!
      Zuletzt editiert von kogen; 23.11.2014, 16:39.

      Comment


      • #4
        Hallo,

        im Eingangspost die FileStreame-Close()-Methode vergessen habe
        Schau dir mal using an.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo gfoidl,

          danke für deinen Tipp! Die using-Direktive werde ich zukünftig bei FileStream beherzigen! Hier das aktuelle Codesnippet:

          [highlight=c#] using (FileStream fs = new FileStream(@path, FileMode.Open))
          {
          string last_lines = "";
          int datei_ende = Convert.ToInt32(fs.Length);
          byte[] buffer = new byte[500];
          fs.Position = fs.Length - 500;
          fs.Read(buffer, 0, buffer.Length);

          for (int i = buffer.Length - 1; i > 0; i--)
          {
          last_lines = Convert.ToChar(buffer[i]) + last_lines;
          }

          richTextBox1.Text = last_lines;
          }[/highlight]

          Lieben Gruß
          Zuletzt editiert von kogen; 23.11.2014, 16:41.

          Comment

          Working...
          X