2009-03-27 4 views
0

В настоящее время я пытаюсь выяснить, как сохранить содержимое из RichTextbox в поток (в настоящее время используется FileStream) и сделать это вместе с рядом других данных. Тогда, конечно, я хочу иметь возможность загрузить из этого файла. В настоящее время я пытаюсь использовать что-то в следующих строках.Сохранение/загрузка RichTextBox Содержимое с другими данными с использованием C#

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

Почему вы отправляете половину кода? – Shimmy

ответ

0

Вы можете загрузить/сохранить в MemoryStream решить проблему с чтением до конца файла. Это может выглядеть следующим образом:

  • Загрузите файл в память
  • Загрузите раздел этого файла, что содержимое RichTextBox в MemoryStream
  • Загрузите содержимое RichTextBox из этой MemoryStream

Или вы хотите знать, как создать и проанализировать файл, чтобы содержать разные разделы для заголовка, содержимого и любых других полей?

+0

Как я могу определить, сколько времени содержимое RichTextBox? Я бы записал в файл несколько байт (-ов) сразу после написания содержимого RichTextBox. Итак, я мог бы рассказать, как, когда содержимое действительно заканчивается и используется байт [] перед флагом в качестве MemoryStream? Это мое лучшее предположение. – Jasson

+0

Вам не нужен флаг. Поскольку вы сохраняете различные текстовые диапазоны как RTF, все документы RTF начинаются с '{\ rtf' и заканчиваются символом '}'. (См. RTF Spec 1.9.1.) Конечно, это означает анализ вашего потока, но вы все равно должны были это сделать, чтобы найти свой заголовок, субтитры и т. Д. На основе вашего кода выше. – Ants

+0

Я заработал. Я не разбирал его, ища «{\ rtf» и «}», однако я посмотрю, что в ближайшем будущем, поскольку это может быть лучше/безопаснее, чем делать это, чем то, что я сейчас делаю. Спасибо за помощь, ребята! Я очень ценю это! : D – Jasson

0

Я решил, что должен опубликовать свое текущее решение. Кажется, он работает отлично. Спасибо Крису и Муравьям за подсказки о том, как это сделать.

/// <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:

Я использовал профайлер и обнаружил, что этот код не был очень эффективным, так что я изменил этот код, чтобы быть гораздо более эффективным в нескольких направлениях.

  1. Вместо использования TextRange и использования байта [], который содержит содержимое memStream MemoryStream. Это сокращает диапазон.Загрузка, которая потребляет много CPU.

  2. Я вынул линию stream.Position = startPos + length, потому что я понял, что это бесполезно после первого запуска, а также заняло приличное количество CPU. Я разместил stream.Position--; после строки previousByte = stream.ReadByte();

Также я понял, что я плохой кодер и не следовал за MVC, имея TextRange, элемент пользовательского интерфейса, внутри моего класса данных. Теперь у него есть байт [], который намного лучше.

EDIT СНОВА:

Через несколько минут, имеющих байт [] вместо TextRange я понял, что размер байта [], поэтому мне не нужно, чтобы разобрать его. Поэтому вместо этого я сохраняю запись размера байта [], а затем байта []. Это делает его очень быстрым и может читать очень большой файл почти мгновенно.

+0

Спасибо Jasson - пример StackOverflowering:) – T4NK3R

Смежные вопросы