Einzelnen Beitrag anzeigen

a.def
(Gast)

n/a Beiträge
 
#11

AW: Schwierigkeiten mit 7-zip und Events

  Alt 6. Dez 2016, 09:45
Mein viel größeres Problem besteht darin festzustellen, wann eine Datei fertig komprimiert wurde. Dafür bietet JCL leider kein Event.
Meine behilfsmäßige Lösung ist sehr kompliziert und funktioniert nur bei größeren Dateien und das ist ja nicht Sinn der Sache
Sinn dahinter ist, dass ich zählen möchte wie viele Dateien vollständig komprimiert wurden + deren Dateigrößen möchte ich auch festhalten.
Mit einem vernünftigen Event wie "OnProgressFileFinished" oder so wär das alles kein Problem.

Delphi-Quellcode:
var
 iFileSizeOld, iFileSizeCompressed: Int64;
 iFilesCompressed, iCurrentItem: Integer;

procedure TForm1.JclCompressionArchiveProgress(Sender: TObject; const Value, MaxValue: Int64);
 function getPercent(const aBase, aValue: Extended): ShortInt;
 begin
  if (aValue > 0) and (aBase > 0) then
   Result := Trunc((aValue / aBase * 100) + 0.5)
  else
   Result := 0;
 end;

var
 iTmpPos, iTmp: Integer;
begin
 iTmpPos := getPercent(MaxValue, Value);
 if (iTmpPos <> ProgressBar1.Position) or (iTmpPos = ProgressBar1.Max) then
  begin
   if ((Sender as TJclCompressionArchive).ItemCount > iFilesCompressed) then
    begin
     ProgressBar1.Position := iTmpPos;
     iFileSizeOld := (Sender as TJclCompressionArchive).Items[iFilesCompressed].FileSize;
     iTmp := getPercent(iFileSizeOld, Value - iFileSizeCompressed);

     if iTmp >= 100 then // bei größeren Dateien kann man hier davon ausgehen, dass sie fertig komprimiert wurde
      begin
       inc(iFileSizeCompressed, iFileSizeOld);

       if iFilesCompressed < (Sender as TJclCompressionArchive).ItemCount then
        begin
         ShowMessage('Datei fertig');
         inc(iFilesCompressed);
        end;
      end;
    end;
  end;
end;
Edit
ich habe das Ganze jetzt mal etwas gekürzt und nun funktioniert es auch mit sehr kleinen Dateien (< 10 Byte etc).
Delphi-Quellcode:
var
 iFileCount, iFileSizeOld, iFileSizeCompressed: Int64;
 iFilesCompressed: Integer;

// ... Button der das Archiv erzeugt...
// ...
 iFileCount := 2; // Nur Dateien werden hier gezählt. Leere Verzeichnisse werden von JCL anders erstellt
 (aCompressArchive as TJclCompressArchive).AddFile('kleinedatei 1.txt', 'E:\7ztest\kleinedatei 1.txt');
 (aCompressArchive as TJclCompressArchive).AddFile('kleinedatei 2.txt', 'E:\7ztest\kleinedatei 2.txt');
// ...

procedure TForm1.JclCompressionArchiveProgress(Sender: TObject; const Value, MaxValue: Int64);
 function getPercent(const aBase, aValue: Extended): ShortInt;
 begin
  if (aValue > 0) and (aBase > 0) then
   Result := Trunc((aValue / aBase * 100) + 0.5)
  else
   Result := 0;
 end;

begin
 if (iFilesCompressed < iFileCount) then
  begin
   ProgressBar1.Position := getPercent(MaxValue, Value);
   iFileSizeOld := (Sender as TJclCompressionArchive).Items[iFilesCompressed].FileSize;
   if (Value >= (iFileSizeOld + iFileSizeCompressed)) then
    begin
     inc(iFilesCompressed);
     inc(iFileSizeCompressed, iFileSizeOld);
    end;
  end;
end;

Geändert von a.def ( 6. Dez 2016 um 18:07 Uhr)
  Mit Zitat antworten Zitat