我目前正在尝试弄清楚如何将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
答案 0 :(得分:0)
您可以加载/保存到MemoryStream,以解决读取文件末尾的问题。它看起来像这样:
或者您想知道如何创建和解析文件以包含标题,内容和任何其他字段的不同部分?
答案 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
编辑:
我使用了一个分析器,发现这段代码效率不高,所以我在一些方面改变了这段代码的效率。
而不是使用TextRange并使用byte []来保存MemoryStream memStream的内容。这减少了范围。负载消耗大量CPU的负载。
我拿出了line stream.Position = startPos + length因为我意识到它在第一次运行后没用,并占用了相当数量的CPU。我放了stream.Position--;在行PreviousByte = stream.ReadByte();
此外,我意识到我是一个糟糕的程序员,并且没有通过在我的数据类中使用TextRange,UI元素来关注MVC。现在它有一个byte [],这要好得多。
再次编辑:
在使用byte []而不是TextRange几分钟后,我意识到我有字节[]的大小所以我不需要解析它。所以我省了写byte []大小然后写byte []。这使它非常快,几乎可以立即读取一个非常大的文件。