Einzelnen Beitrag anzeigen

Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#21

AW: Zip erstellen über Shell API

  Alt 10. Jun 2010, 17:03
Hach, tolles Thema hier, man kann es alle paar Tage/Wochen mal wieder aufwärmen.

Ich wollte die hier vorgestellte Lösung, um die Windows-Shell zum Erstellen von ZIPs zu benutzen, auch in ein Programm von mir einbauen. Kleine Besonderheit: Ich will nicht ein ganzes Verzeichnis packen, sondern nur ein paar bestimmte Dateien in diesem Verzeichnis. Setze ich hier in der Unit allerdings den Filter, dann zeigt Windows den Fortschritts-Dialog (zumindest bei mir) nicht mehr an, was ja irgendwie auch blöd ist. Also dachte ich mir: Macht ja nix, bastelst du dir halt selber etwas drumrum, das anzeigt welche Dateien gerade behandelt werden.

Die zentrale Prozedur sieht dann (erstmal) so aus:

Delphi-Quellcode:
procedure ZipFileList (aSrcDir: string; aFilter: string; aDstFile: string);

var myZip: TShellZip;
    formZip: TformZip;
    foundFiles: TStringList;
    findRec: TSearchRec;
    findResult: integer;
    newItem: TListItem;
  I: Integer;

begin
  foundFiles:=TStringList.Create;

  findResult:=FindFirst(aSrcDir+'\'+aFilter,0,findRec);
  while findResult=0 do begin
    foundFiles.Add(ExtractFileName(findRec.Name));
    findResult:=FindNext(findRec);
  end;

  formZip:=TformZip.Create(nil);
  for I := 0 to foundFiles.Count - 1 do begin
    newItem:=formZip.ListFileStatus.Items.Add;
    newItem.Caption:=foundFiles[i];
  end;
  formZip.Show;
  Application.ProcessMessages;

  myZip:=TShellZip.Create;
  myZip.Zipfile:=aDstFile;
  i:=0;
  while (i<=foundFiles.Count-1) and (not formZip.isCancelled) do begin
    formZip.ListFileStatus.Items[i].SubItems.Add('Läuft...');
    myZip.Filter:=foundFiles[i];
    myZip.ZipFolder(aSrcDir);
    formZip.ListFileStatus.Items[i].SubItems[0]:='OK';
    inc(i);
    Application.ProcessMessages;
  end;

  formZip.Free;
  myZip.Free;
  foundFiles.Free;
end;
(das Form hat ein ListView, um die Dateien anzuzeigen, die abgearbeitet werden, und einen Abbrechen-Button)

Läuft eigentlich auch alles total super, außer: Beim allerersten Aufruf von myZip.ZipFoler braucht diese Funktion unglaublich lange, um wieder zurückzukommen, obwohl die Datei schon längst zur Zip-Datei hinzugefügt wurde. Die Funktion hängt recht lange hier rum:
Delphi-Quellcode:
  // wait till all shell threads are terminated
  while NumProcessThreads <> numt do
  begin
    sleep(100);
  end;
Irgendwie braucht es total lange, bis gemerkt wird, dass der Thread beendet wurde. Aber: Nur beim allerersten Aufruf, bei den weiteren Aufrufen kommt die Funktion sofort nach getaner Arbeit zurück.

Hat irgendwer eine Idee, ob man noch etwas dagegen tun könnte?

Danke und bis denn
Bommel
  Mit Zitat antworten Zitat