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;