使用C#保存/加载RichTextBox内容和其他数据

时间:2009-03-27 05:32:34

标签: c# load richtextbox save

我目前正在尝试弄清楚如何将RichTextbox中的内容保存到流中(目前使用的是FileStream),并将其与一堆其他数据一起执行。然后我当然希望能够从这个文件加载。 我目前正在尝试使用以下几行。

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.

这基本上就是我想要做的。我实际上正在保存2个TextRanges和更多的属性。所以我的问题是TextRange.Load()读到文件的末尾...使我无法使用它,因为我有2个TextRanges我需要保存/加载。 所以在这里我试图想出另一种方法来保存/加载RichTextBox的内容和其他数据。我不必使用Stream。我对任何可行的解决方案都很开放。提前谢谢!

〜Jasson

2 个答案:

答案 0 :(得分:0)

您可以加载/保存到MemoryStream,以解决读取文件末尾的问题。它看起来像这样:

  • 将文件加载到内存中
  • 将该文件的作为richtextbox内容的部分加载到MemoryStream
  • 从该MemoryStream中加载richtextbox内容

或者您想知道如何创建和解析文件以包含标题,内容和任何其他字段的不同部分?

答案 1 :(得分:0)

我想我应该发布我目前的解决方案。它似乎完美无缺。谢谢Chris和Ants关于如何做到这一点的提示。

/// <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;
    }

此ReadTextRange方法位于我定义的StreamHelper类中,用于帮助从FileStream读取。所以这一切都是加载像FileStream一样保存的TextRange ......

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

我希望有人在遇到类似问题时发现这个有用! :d

编辑:

我使用了一个分析器,发现这段代码效率不高,所以我在一些方面改变了这段代码的效率。

  1. 而不是使用TextRange并使用byte []来保存MemoryStream memStream的内容。这减少了范围。负载消耗大量CPU的负载。

  2. 我拿出了line stream.Position = startPos + length因为我意识到它在第一次运行后没用,并占用了相当数量的CPU。我放了stream.Position--;在行PreviousByte = stream.ReadByte();

  3. 之后

    此外,我意识到我是一个糟糕的程序员,并且没有通过在我的数据类中使用TextRange,UI元素来关注MVC。现在它有一个byte [],这要好得多。

    再次编辑:

    在使用byte []而不是TextRange几分钟后,我意识到我有字节[]的大小所以我不需要解析它。所以我省了写byte []大小然后写byte []。这使它非常快,几乎可以立即读取一个非常大的文件。