Как я могу использовать TFileStream для усечения существующего файла перед его перезаписью?

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

procedure TUtilitiesForm.btnSaveClick(Sender: TObject);
var fs: TFileStream;
begin
  fs := TFileStream.Create(FileNameEdit1.Text, fmOpenWrite);
  fs.Seek(0,fsFromEnd);
  mmoDDL.Lines.SaveToStream(fs);
  fs.Free;
end;

person vfclists    schedule 28.02.2016    source источник


Ответы (1)


Используя fsFromEnd, вы добавляете данные за конец существующего файла, с другой стороны, fsFromBeginning начинается с начала, но не усекает файл.

Изменить с fmOpenWrite на fmCreate

procedure TUtilitiesForm.btnSaveClick(Sender: TObject);
var fs: TFileStream;
begin
  fs := TFileStream.Create(FileNameEdit1.Text, fmCreate);
  try
    mmoDDL.Lines.SaveToStream(fs);
  finally
    FreeAndNil(fs);
  end;
end;
person Joao Morais    schedule 28.02.2016
comment
Я изменил режим Create на fmCreate и изменил поиск на fsFromBeginning, и теперь все работает правильно. Делает ли использование fmCreate поиск излишним? - person vfclists; 28.02.2016
comment
@vfclists Да. fmCreate воссоздаст файл без данных, поэтому нет смысла позиционировать поток. - person Joao Morais; 28.02.2016