Delphi: TFileStream и TStringList сохраняют пустой текстовый файл

Я учусь в колледже (Великобритания) и использую Delphi для своего проекта A2 Computing. Я действительно не очень продвинут, поэтому, пожалуйста, потерпите меня! Итак, я использую TStringList для сохранения содержимого TMemoBox в текстовый файл после его шифрования. Однако это было невозможно из-за того, что TStringList показывал разрыв строки после сообщения, которое нарушало шифрование. Я следил за этой статьей, которая использует как TStringList, так и TFIleStream для удаления этого, но вместо предоставления мне полный текстовый файл, результат пустой. Пожалуйста, не могли бы вы помочь сохранить данные, а не хранить их вообще? Большое спасибо. Вот часть моей процедуры.

var
  EmailText : TStringList;
  FileStream : TFileStream;
begin
  FileName := 'email1.txt';
  EmailText := TStringList.Create;
  FileStream := TFileStream.Create(Filename, fmCreate);          

  EmailText.SaveToStream(FileStream, EmailText.Encoding);
  FileStream.Size := FileStream.Size - Length(System.sLineBreak);           
  EmailText.Add(EmailMessageMemo.Text);                            
  FileStream.Free;
  EmailText.Free;

person Toby Fox    schedule 28.11.2014    source источник
comment
Предполагается, что метод TStringList.Add добавляет строку, что означает, что он добавит EOL к аргументу и добавит полученную вещь в объект списка строк. Вместо этого вы можете попробовать EmailText.Text := EmailMessageMemo.Text;, который, насколько мне известно, должен копировать содержимое дословно.   -  person Andriy M    schedule 29.11.2014
comment
@TLama Спасибо за ответ, но это все еще создает разрыв строки в моем файле .txt при его сохранении ...   -  person Toby Fox    schedule 29.11.2014
comment
@AndriyM спасибо за помощь, но это все равно приводит к разрыву строки в моем документе :/   -  person Toby Fox    schedule 29.11.2014
comment
Хорошо, это моя ошибка, я думаю, что я неправильно читаю это в Memo, так как строка генерируется при чтении файла, а не при его сохранении. Я поработаю и дам вам знать   -  person Toby Fox    schedule 29.11.2014
comment
Что вам действительно нужно сделать, так это принять тот факт, что шифрование текста является ошибкой. Шифрование работает в двоичном формате. Самое важное, что вам не хватает, — это разница между текстом и двоичным кодом. Я знаю, это не то, что вы хотите услышать, но все равно.   -  person David Heffernan    schedule 29.11.2014
comment
@DavidHeffernan Спасибо за совет, но мое шифрование на самом деле работает нормально, просто из-за символа разрыва строки отображение расшифрованных результатов испортилось!   -  person Toby Fox    schedule 29.11.2014
comment
Шифрование работает в двоичном формате. Вы, вероятно, делаете что-то другое, чем шифрование. Я как заезженная пластинка на эту тему. Ты никогда не заставишь меня уступить.   -  person David Heffernan    schedule 29.11.2014
comment
Я отменил ваше редактирование. Это было не по теме. Вопрос, который вы задали, см. выше, заключался в том, почему сохраненный вами файл был пуст.   -  person David Heffernan    schedule 29.11.2014
comment
Еще кое-что, о чем следует помнить: TStrings имеет собственное свойство LineBreak, поэтому этот код должен использовать Length(EmailText.LineBreak) вместо Length(System.sLineBreak). Но это зависит от того, что LineBreak всегда кодирует 8-битные значения без суррогатов. Вместо этого более точным подходом было бы использование EmailText.Encoding.GetByteCount(EmailText.LineBreak).   -  person Remy Lebeau    schedule 29.11.2014


Ответы (1)


EmailText := TStringList.Create; // new string list, empty
FileStream := TFileStream.Create(Filename, fmCreate); 
EmailText.SaveToStream(FileStream, EmailText.Encoding); 

Итак, вы сохранили пустой список строк в файл. Следовательно, ваш файл пуст, потому что ваш список строк пуст.

Я предполагаю, что вы намеревались добавить содержимое в список строк до того, как сохранили его.

EmailText := TStringList.Create;
EmailText.AddStrings(EmailMessageMemo.Lines);
FileStream := TFileStream.Create(Filename, fmCreate); 
EmailText.SaveToStream(FileStream, EmailText.Encoding); 

Однако дополнительный список строк не нужен. Вы можете сделать это следующим образом:

FileStream := TFileStream.Create(Filename, fmCreate); 
EmailMessageMemo.Lines.SaveToStream(FileStream, TEncoding.Default); 

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

person David Heffernan    schedule 28.11.2014
comment
Привет, спасибо за ваш ответ. Я следую вашему короткому редактированию и получаю сообщение об ошибке: «TMemo не содержит участника с именем« SaveToStream ». Я просто туплю или это реальная проблема? Еще раз спасибо! - person Toby Fox; 29.11.2014
comment
@TobyFox: TMemo сам по себе не имеет метода SaveToStream(), но есть его свойство Lines, как показал вам Дэвид: EmailMessageMemo.Lines.SaveToStream(...); - person Remy Lebeau; 29.11.2014