Alle Dateien aus einer Liste entpacken

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

Hallo!

Ich baue ein kleines Programm, in dem unter anderem alle ZIP-Dateien aus einem angewählten Ordner entpackt werden sollen. Dazu möchte ich "TUnZipper" nutzen. Dabei soll jede ZIP-Datei im Verzeichnis

Code: Alles auswählen

SelectDirectoryDialogAusgabe.FileName + '/Temp'
in einem eigenen Unterordner liegen, dessen Name dem der ZUP-Datei entspricht.

Die ZIP-Dateien wurden zu dem Zeitpunkt schon eingelesen:

Code: Alles auswählen

 
procedure ListeZIPs(Pfad: string; DateiListe: TStrings);
var
  SR: TSearchRec;
begin
  if FindFirst(Pfad + '\' + '*.zip', faAnyFile, SR) = 0 then // Hier wird die Syntax im Forum falsch dargestellt
  begin
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        DateiListe.Add(SR.Name);
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;   


Nun sollen die Dateien entpackt werden:

Code: Alles auswählen

procedure TMainForm.bbDokumentationErstellenClick(Sender: TObject);
  var
     UnZippen: TUnZipper;
begin
    //Entpacken der Dateien
  UnZippen := TUnZipper.Create;
  try
    UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '\k3a1g1524150r05\k3a1g1524150r05.zip';    //Hier habe ich "hart" einen Ordner& Dateiname hingeschrieben.
    UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp';
    UnZippen.Examine;
    UnZippen.UnZipAllFiles;
  finally
    UnZippen.Free;
  end;
end;


Leider bin ich nicht in der Lage, Lazarus zu erklären, wie das von statten geht. Sicher könnt ihr mir helfen!

Danke im Vorraus

Pascal

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Alle Dateien aus einer Liste entpacken

Beitrag von wp_xyz »

Sieht auf den ersten Blick vernünftig aus. Was ist denn genau das Problem? Hast du die zipper-Unit unter "uses" aufgeführt?

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

Das genaue Problem ist, dass ich nicht weis, wie ich a) mehrere Dateien, welche in einer Liste (

Code: Alles auswählen

Dateiliste: TStrings;
) enpacken kann (bisher klappt nur das "hart" hineingeschriebene) und b) zusätzlich jede Datei in einen eigenen Ordner (Name des Ordners = Dateiname der ZIP ohne .zip) entpacken kann. :(

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Alle Dateien aus einer Liste entpacken

Beitrag von m.fuchs »

Du musst durch deine Liste iterieren. Zum Beispiel mit for...in:

Code: Alles auswählen

procedure Blafasel(Liste: TStrings);
var
  s: String;
begin
  for s in Liste do begin
    MachIrgendWasMitEinemString(s);
  end;
 
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

Okay danke, aber leider weis ich nicht, wie ich das umsetzen soll. :oops: Kannst du mir konkret sagen, wie ich die Liste abarbeite?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Alle Dateien aus einer Liste entpacken

Beitrag von m.fuchs »

Hm, du hast doch deine Aufgabe oben schon mit hart-codierten Strings gelöst. Das musst du dann innerhalb der Schleife machen und die Strings durch s (oder Bearbeitungen) ersetzen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

Ja genau das bereitet mir noch Probleme... Momentaner Stand:

Code: Alles auswählen

UnZippen := TUnZipper.Create;
              try
                  UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '/' + lbROBOTERLISTE.Items.Strings [lbROBOTERLISTE.ItemIndex] ;
                  UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp/' + lbROBOTERLISTE.Items.Strings [lbROBOTERLISTE.ItemIndex] ;
                  UnZippen.Examine;
                  UnZippen.UnZipAllFiles;
               finally
                  UnZippen.Free;
               end;


Das "Problem" an der Sache ist, dass nur selektierte Einträge in "lbROBOTERLISTE" entpackt werden sollen... Multiselect habe ich aktiviert, leider wird nur der erste Eintrag, welcher selektiert wurde entpackt. Wenn ich jetzt Eintrag 3, 7, 8, 12 anklicke (mit strg) dann wird nur 3 entpackt...

Hast du einen Lösungsvorschlag?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Alle Dateien aus einer Liste entpacken

Beitrag von m.fuchs »

Grumpf, wenn ich etwas hasse, dann sind es unvollständige Informationen. Nun ist es keine TStringList mehr, sondern eine unbekannte Komponente namens "lbROBOTERLISTE". Ich VERMUTE mal, es handelt sich um eine TCheckListBox?

Dann musst du durch alle Einträge gehen (for..to..do) und für jeden Eintrag prüfen, ob er ausgewählt ist. Das kannst du mit der Property Checked machen. Wenn die für den jeweiligen Index auf True steht, dann entpackst du die Dateien.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

m.fuchs hat geschrieben:Grumpf, wenn ich etwas hasse, dann sind es unvollständige Informationen. Nun ist es keine TStringList mehr, sondern eine unbekannte Komponente namens "lbROBOTERLISTE". Ich VERMUTE mal, es handelt sich um eine TCheckListBox?

Dann musst du durch alle Einträge gehen (for..to..do) und für jeden Eintrag prüfen, ob er ausgewählt ist. Das kannst du mit der Property Checked machen. Wenn die für den jeweiligen Index auf True steht, dann entpackst du die Dateien.


Sorry war nicht meine Absicht :-) Newbe halt. Also: "lbROBOTERLISTE" ist eine TListBox... Ich bin mal so frei un paste das gesamte Programm: http://pastebin.com/ejepNYjp Der interessante Teil ist ab Zeile 170 zu finden.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Alle Dateien aus einer Liste entpacken

Beitrag von m.fuchs »

Ok, dann geht es dir um die Auswahl. In diesem Fall benutzt du statt Checked einfach die Property Selected.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

pascalts
Beiträge: 61
Registriert: Fr 10. Okt 2014, 13:16

Re: Alle Dateien aus einer Liste entpacken

Beitrag von pascalts »

m.fuchs hat geschrieben:Ok, dann geht es dir um die Auswahl. In diesem Fall benutzt du statt Checked einfach die Property Selected.


Okay. Hab mich jetzt doch für eine TCheckListBox entschieden - also Checked. Bevor ich eine schleife baue habe ich das ganze mal mit 3 Stück ausprobiert:

Code: Alles auswählen

if lbROBOTERLISTE.Checked[0] then
                        begin
                       UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '/' + lbROBOTERLISTE.Items.Strings [0 ] ;
                       UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp/' + lbROBOTERLISTE.Items.Strings [0 ] ;
                       UnZippen.Examine;
                       UnZippen.UnZipAllFiles;
                        end;
 
                       if lbROBOTERLISTE.Checked[1] then
                        begin
                       UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '/' + lbROBOTERLISTE.Items.Strings [1 ] ;
                       UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp/' + lbROBOTERLISTE.Items.Strings [1 ] ;
                       UnZippen.Examine;
                       UnZippen.UnZipAllFiles;
                        end;
 
                       if lbROBOTERLISTE.Checked[2] then
                        begin
                       UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '/' + lbROBOTERLISTE.Items.Strings [2 ] ;
                       UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp/' + lbROBOTERLISTE.Items.Strings [2 ] ;
                       UnZippen.Examine;
                       UnZippen.UnZipAllFiles;
                        end;                       


Funktioniert ganz gut, wenn alle 3 vorhanden sind. Sind aber nur 2 (oder 1) vorhanden, kann er nicht abfragen ob sie gecheckt sind... gibt also eine Fehlermeldung. Kann man vorher überprüfen, ob die Zeile überhaupt existiert?

Fehlermeldung: ....."TCheckListBox Index 2 out of bounds 0 .. 1"

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Alle Dateien aus einer Liste entpacken

Beitrag von wp_xyz »

Mach halt eine Schleife, in der du die Items der CheckedListbox durchläufst:

Code: Alles auswählen

 
var
  i: Integer;
begin
  for i:=0 to lbRoboterListe.Items.Count-1 do
    if lbRoboterListe.Checked[i] then begin
      UnZippen.FileName := SelectDirectoryDialogStammverzeichnis.FileName + '/' + lbROBOTERLISTE.Items[i];
      UnZippen.OutputPath := SelectDirectoryDialogAusgabe.FileName + '/Temp/' + lbROBOTERLISTE.Items[i];
        // "...Items[i]" ist dasselbe wie "...Items.Strings[i]", aber weniger zu schreiben...
      UnZippen.Examine;
      UnZippen.UnZipAllFiles;
    end;
end;
 
Zuletzt geändert von wp_xyz am Di 14. Okt 2014, 15:35, insgesamt 1-mal geändert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Alle Dateien aus einer Liste entpacken

Beitrag von m.fuchs »

Naja, bei einer Schleife würdest du ja einer Obergrenze festlegen. Die Anzahl der Items bekommst du über CheckListBox.Items.Count.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten