uses
  'Un_ConstRef',
  'Un_Progress',
  'Un_System',
  'Un_Log',
  'Un_Debug';

const
  TestFileName = 'Exp_Fk_Zip.Xml';

var
  FmZipCompress: TForm;
  ZipForge: TZipForge;
  LabelFileName, LabelFileProc, LabelAllProc: TLabel;
  ProgressBarFile, ProgressBarAll: TProgressBar;
  ButtonCancel: TButton;
  VectLogFile: array of string;
  
//Сохранение тестовых Xml
function SaveXmlTest(Xml: Variant; TestFileName: String): Boolean;
begin
  Result := True;
  with Xml.documentElement do
    if getAttribute('TESTED') = 'True' then
    begin
      setAttribute('TESTED', 'False');
      Xml.loadXml(FormatXmlData(Xml.documentElement.xml));
      Xml.save('C:\' + TestFileName);
      ShowMessage('Тестовый пример приготовлен: C:\' + TestFileName);
      Exit;
    end;
  Result := False;
end; {End SaveXmlTest}

procedure OnButtonCancelClick(Sender: TObject);
begin
  ButtonCancel.Enabled := False;
end; {End OnButtonCancelClick}

procedure OnZipForgeFileProgress(Sender: TObject; FileName: String;
  Progress: Double; Operation: TZFProcessOperation;ProgressPhase: TZFProgressPhase;
  var Cancel: Boolean);
begin
  LabelFileName.Caption := FileName;
  ProgressBarFile.Position := Round(Progress);
  LabelFileProc.Caption := IntToStr(ProgressBarFile.Position) + '%';
  Cancel := not ButtonCancel.Enabled;
end; {End TFmZipCompress.ZipForgeFileProgress}

procedure OnZipForgeOverallProgress(Sender: TObject; Progress: Double;
  Operation: TZFProcessOperation; ProgressPhase: TZFProgressPhase; var Cancel: Boolean);
begin
  ProgressBarAll.Position := Round(Progress);
  LabelAllProc.Caption := IntToStr(ProgressBarAll.Position) + '%';
end; {End TFmZipCompress.ZipForgeOverallProgress}

procedure Main(Xml: Variant);
var
  i: Integer;
  LogExists: Boolean;
  ConfFile: TFileSearch;
  DirArhLog: String;
begin
  if CompareVersion(AppVersion, WorkAppVersion) < 0 then
    raise('Скрипты работают с AzkEchange.Exe начиная с версии: ' + WorkAppVersion +
      ''#13#10'Текущая версия AzkEchange.Exe: ' + AppVersion);
  if CompareVersion(AzkVersion, WorkAzkVersion) < 0 then
    raise('Скрипты работают с АЦК-Финансы начиная с версии: ' + WorkAzkVersion +
      ''#13#10'Текущая версия АЦК-Финансы: ' + AzkVersion);
  if SaveXmlTest(Xml, TestFileName) then
    Exit;
  DirIni := ExtractFilePath(Xml.documentElement.getAttribute('INI_FILE'));
  LogExists := False;
  ConfFile := TFileSearch;
  try
    //ищем все конфиги, т.к. файлы логов называются также, но только
    //расширение Log, и записываем в массив название файлов логов.
    if ConfFile.FindFirst(DirIni + '*.cfg', faAnyFile) = 0 then
    begin
      i := 0;
      repeat
        if (ConfFile.Name <> '.') and (ConfFile.Name <> '..') and
          (ConfFile.Attr <> faDirectory) then
        begin
          SetLength(VectLogFile, i + 1);
          VectLogFile[i] := DirIni +  StringReplace(ConfFile.Name, '.cfg', '.Log');
          Inc(i);
        end;
      until ConfFile.FindNext <> 0;
      ConfFile.FindClose;
    end;
  finally
    ConfFile.Free;
  end;
  for i := 0 to Length(VectLogFile) - 1 do
    if FileExists(VectLogFile[i]) then
      LogExists := True;
  if not LogExists then
  begin
    MessageDlg('Нет файлов истории обработки по формату FK', mtWarning , mbCancel , 0);
    Exit;
  end;
  DirArhLog := DirIni + 'FkArhLog\' + FormatDateTime('yyyy-mm-dd', Date);
  if FileExists(DirArhLog + '.zip') then
  begin
    MessageDlg('Сегодня уже производилось архивирование: ' + DirArhLog + '.zip',
      mtWarning , mbCancel , 0);
    Exit;
  end;
  ForceDirectories(DirArhLog);
  if not DirectoryExists(DirArhLog) then
    raise('Ошибка создания каталога: ' + DirArhLog);
  for i := 0 to Length(VectLogFile) - 1  do
    CopyFile(VectLogFile[i], DirArhLog + '\' + ExtractFileName(VectLogFile[i]), False);
  FmZipCompress := TForm.Create(Application);
  ZipForge := TZipForge.Create(FmZipCompress);
  try
    LoadForm(DirIni + '\Forms\Fm_FkZipLog.dfm', FmZipCompress);
    ZipForge.OnFileProgress := @OnZipForgeFileProgress;
    ZipForge.OnOverallProgress := @OnZipForgeOverallProgress;
    LabelFileName := TLabel(FmZipCompress.FindComponent('LabelFileName'));
    LabelFileProc := TLabel(FmZipCompress.FindComponent('LabelFileProc'));
    ProgressBarFile := TProgressBar(FmZipCompress.FindComponent('ProgressBarFile'));
    LabelAllProc := TLabel(FmZipCompress.FindComponent('LabelAllProc'));
    ProgressBarAll := TProgressBar(FmZipCompress.FindComponent('ProgressBarAll'));
    ButtonCancel := TButton(FmZipCompress.FindComponent('ButtonCancel'));
    ButtonCancel.OnClick := @OnButtonCancelClick;
    ZipForge.FileName := DirArhLog + '.zip';
    FmZipCompress.Caption := 'Создание архива ' + ExtractFileName(ZipForge.FileName);
    FmZipCompress.Show;
    ZipForge.OpenArchive(fmCreate);
    ZipForge.BaseDir := DirIni + 'FkArhLog';
    ZipForge.AddFiles(FormatDateTime('yyyy-mm-dd\*.*', Date));
    ZipForge.CloseArchive;
    if not ButtonCancel.Enabled then
      DeleteFile(ZipForge.FileName)
    else
    begin
      for i := 0 to Length(VectLogFile) - 1 do
      begin
        DeleteFile(DirArhLog + '\' + ExtractFileName(VectLogFile[i]));
        DeleteFile(VectLogFile[i]);
      end;
      RemoveDir(DirArhLog);
      FmZipCompress.Close;
      MessageDlg('Архивирование завершено успешно, архив: ' + DirArhLog + '.zip',
        mtInformation, mbOk , 0);
    end;
  finally
    FmZipCompress.Free;
  end;
end; {End Main}

var
  Xml: Variant;
begin
  Xml := CreateOleObject('Microsoft.XmlDom');
  Xml.Load('C:\FK_ZipLog.xml');
  Main(Xml);
end.