Frage

Ich versuche zur Zeit, um herauszufinden, wie der Inhalt von einem RichTextbox in einen Strom sparen (derzeit Filestream verwendet wird) und dieses von anderen Daten neben ein Bündel tun. Dann natürlich mag ich in der Lage sein, aus dieser Datei zu laden. Ich war zur Zeit versucht, etwas entlang der folgenden Zeilen zu verwenden.

FileStream stream = new FileStream(); //this is actually correctly defined.
ASCIIEncoding encoding = new ASCIIEncoding();

//write Title
byte[] array = encoding.GetBytes(Title);
stream.WriteByte(Convert.ToByte(array.Length));
stream.Write(array, 0, array.Length);

//save textRange
textRange.Save(stream, System.Windows.DataFormats.Rtf);

//write Subtitle
byte[] array = encoding.GetBytes(Subtitle);
stream.WriteByte(Convert.ToByte(array.Length));
stream.Write(array, 0, array.Length);
//ect...and something very similar for Loading a file.

Dies ist im Grunde, was ich zu tun versuchen. Ich spare tatsächlich 2 TextRanges und ein paar mehr Eigenschaften. Also mein Problem ist, dass TextRange.Load () liest bis zum Ende der Datei ... es mir unmöglich machen zu verwenden, die unter Berücksichtigung Ich habe 2 TextRanges Ich muss Speichern / Laden. Also hier versuche ich, mit einer anderen Art und Weise zu entwickeln, um die Lage sein, den Inhalt eines RichTextBox mit anderen Daten zu speichern / laden. Ich nicht haben einen Strom zu verwenden. Ich bin ziemlich offen für alle praktikablen Lösungen. Vielen Dank im Voraus!

~ Jasson

War es hilfreich?

Lösung

Sie könnten laden / speichern zu einem Memory Ihrem Problem zu lösen, bis zum Ende der Datei mit dem Lesen. Es könnte wie folgt aussehen:

  • Legen Sie die Datei in den Speicher
  • Laden Sie den Abschnitt der Datei, die den Inhalt des richtextbox in einen Memorystream
  • ist
  • Laden Sie die richtextbox Inhalte aus dieser Memory

Oder wollen Sie wissen, wie Sie schaffen würde und eine Datei analysieren, um verschiedene Abschnitte für den Titel und den Inhalt und alle anderen Felder enthalten?

Andere Tipps

Ich dachte, ich sollte meine aktuelle Lösung veröffentlichen. Es scheint völlig in Ordnung zu arbeiten. Danke Chris und Ameisen auf die Hinweise, wie diese gehen zu tun.

/// <summary>
    /// Reads a TextRange (DataFormats.Rtf) from the stream.
    /// </summary>
    /// <param name="stream">The stream to be read from.</param>
    /// <returns>The TextRange (DataFormats.Rtf) that was read from the stream.</returns>
    public static TextRange ReadTextRange(FileStream stream)
    {
        long startPos = stream.Position;
        int length = -1;
        int count = 0;
        int previousByte = 0;
        int currentByte = 0;
        //set previousByte to give the current one something to compare to
        previousByte = stream.ReadByte();
        //parse the file counting the { and } to find the end of the rtf portion of the file.
        while (count > 0 || length < 1)
        {
            length++;
            stream.Position = startPos + length;
            currentByte = stream.ReadByte();
            if (previousByte != 92) // not '\' so check to see if '{' or '}' is currentByte
            {
                if (currentByte == 123) // '{' increase count
                    count++;
                else if (currentByte == 125) // '}' decrease count
                    count--;
            }
            previousByte = currentByte;
        }
        //save finish position to move to later
        long finishPos = stream.Position;
        //reset stream position to start at beginning of rtf
        stream.Position = startPos;
        //read the rtf portion of the file into a byte[]
        byte[] content = new byte[length];
        stream.Read(content, 0, length);
        //put the byte[] into a memory stream
        MemoryStream memStream = new MemoryStream(content);
        FlowDocument doc = new FlowDocument();
        TextRange range = new TextRange(doc.ContentStart, doc.ContentEnd);
        //have the TextRange read from the memorystream
        range.Load(memStream, System.Windows.DataFormats.Rtf);
        memStream.Close();
        //set the position to after the rtf portion of the file
        stream.Position = finishPos;
        return range;
    }

Diese ReadTextRange Methode ist in einer StreamHelper Klasse I für definierte aus einem Filestream lesen zu helfen. Also all dies ist ein Textrange zu laden, die auf die Filestream wie diese gespeichert wird ...

//save query (TextRange)
        Query.Save(stream, System.Windows.DataFormats.Rtf);

Ich hoffe, dass jemand dies nützlich findet, wenn / wenn sie kommen zu einem ähnlichen Problem! : D

EDIT:

habe ich einen Profiler und festgestellt, dass dieser Code nicht sehr effizient war, damit ich diesen Code geändert haben viel effizienter in ein paar Möglichkeiten zu sein.

  1. Statt die Textrange und verwenden ein byte [], die den Inhalt von Memory memStream hält. Dies schneidet range.Load die viel CPU verbraucht.

  2. habe ich die Zeile aus stream.Position = startPos + Länge, weil ich es sinnlos war nach dem ersten Lauf realisiert und nahm auch einen angemessenen Betrag von CPU auf. Ich legte stream.Position--; nach der Zeile previousByte = stream.ReadByte ();

Auch wurde mir klar, ich war ein schlechter Coder zu sein und wurde nach MVC nicht mit Textrange, UI-Elemente, innerhalb meiner Datenklasse. Jetzt hat es ein byte [], die viel besser ist.

Erneut bearbeiten:

Nach wenigen Minuten mit dem byte [] anstelle von Textrange mir klar, ich hatte die Größe des byte [], so dass ich es nicht analysieren müssen. Anstatt also ich spare die byte [] Größe schreiben und dann die byte []. Dies macht es extrem schnell und kann fast sofort eine sehr große Datei lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top