Как (действительно) очистить TClientDataSet - PullRequest
0 голосов
/ 13 сентября 2018

Я использую TClientDataSet для хранения некоторых локальных данных, используя метод «savetofile».

Я заметил, когда я использую код ниже:

// at this point the file myfile.cds has 3000 records and 130 kbytes.
myClientDataSet.loadfromfile('myfile.cds');    
myClientDataSet.emptydataset;
myClientDataSet.savetofile('myfile.cds');
// at this point the file myfile.cds has no records anymore, but still has the same size, 130kb !

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

Спасибо

1 Ответ

0 голосов
/ 13 сентября 2018

при сохранении в файл размер файла остается прежним!Как действительно стереть все данные и размер файла?

Используя собственный тестовый файл .CDS, я не могу воспроизвести ваши результаты - см. Комментарии в следующем коде, которые показывают, что после EmptyDataSet,(повторно) сохраненный файл имеет вероятный, намного меньший размер.

procedure TForm1.FormCreate(Sender: TObject);
begin
  EmptyDataSetTest;
end;

procedure TForm1.EmptyDataSetTest;
var
  SourceFN,
  DestFN : String;
begin
  SourceFN := ExtractFilePath(Application.ExeName) + '\Data\CDSData.Cds';
  //  SourceFN file is 333709 bytes acc to a Dir command in a CMD window
  DestFN := ExtractFilePath(Application.ExeName) + '\Data\DestCDSData.Cds';

  myClientDataSet.LoadFromFile(SourceFN);

  myClientDataSet.EmptyDataSet;
  myClientDataSet.SaveToFile(DestFN);

  //  DestFN file is 2268 acc to a Dir command in a CMD window
  DestFN := ChangeFileExt(DestFN, '.XML');
  myClientDataSet.SaveToFile(DestFN, dfXML);
  //  .XML file is 5128 and the file contains only the field
  //  FIELD descriptor tags under the \DATAPACKET\METADATA\FIELDS node

end;

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

myClientDataSet.Close;
myClientDataSet.Open; 

после

myClientDataSet.CreateDataSet;
...