Я решил, что должен опубликовать свое текущее решение. Кажется, он работает отлично. Спасибо Крису и Муравьям за подсказки о том, как это сделать.
/// <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. Таким образом, все это загрузить TextRange, который сохраняется в FileStream, как это ...
//save query (TextRange)
Query.Save(stream, System.Windows.DataFormats.Rtf);
Я надеюсь, что кто-то считает, что это полезно, если/когда они приходят к подобной проблемой! : D
EDIT:
Я использовал профайлер и обнаружил, что этот код не был очень эффективным, так что я изменил этот код, чтобы быть гораздо более эффективным в нескольких направлениях.
Вместо использования TextRange и использования байта [], который содержит содержимое memStream MemoryStream. Это сокращает диапазон.Загрузка, которая потребляет много CPU.
Я вынул линию stream.Position = startPos + length, потому что я понял, что это бесполезно после первого запуска, а также заняло приличное количество CPU. Я разместил stream.Position--; после строки previousByte = stream.ReadByte();
Также я понял, что я плохой кодер и не следовал за MVC, имея TextRange, элемент пользовательского интерфейса, внутри моего класса данных. Теперь у него есть байт [], который намного лучше.
EDIT СНОВА:
Через несколько минут, имеющих байт [] вместо TextRange я понял, что размер байта [], поэтому мне не нужно, чтобы разобрать его. Поэтому вместо этого я сохраняю запись размера байта [], а затем байта []. Это делает его очень быстрым и может читать очень большой файл почти мгновенно.
Почему вы отправляете половину кода? – Shimmy