Err := False;
Transaction.StartTransaction (snapshort)
try
  Tут идет выборка данных для репликации из базы на основании  лог-таблицы
  и проставление в ней номера пакета,  в который эти данные попадают.
  Запись выбранных данных в cds и сохранение на диск.
  Упаковка полученных файлов в zip и удаление *.cds.
except
  Err := True;
end;

If (not Err)  and  (FileSize(FileNm) > 0)  then
  Transaction.Commit
else begin
  Transaction.Rollback;
  if FileExists(FileNm) then
     DeleteFile(FileNm);
end;


Я главное не врубаюсь, при каких условиях может закоммитится транзакция и файл нулевой длины оказаться. Ну вот даже если по памяти чего-то страшное случилось и хоть и была ошибка, try...except обработать ее не смог и программа умерла. Как же тогда транзакция закоммитилась? Такое впечатление, что win говорит программе, что она файл успешно записала, а он пока еще в кэше болтается. И размер нормальный программе возвращается. А потом, когда программа завершилась, при сбросе файла из кэша на диск происходит какой-то сбой и файл записывается нулевой длины. Может такое быть?

With b/r. Gleb.

Ответить