Zipper

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Zipper

Beitrag von Andromeda »

Hallo,

ich möchte mir ein kleines Programm schreiben, mit dem ich den Inhalt eines Ordners und möglicherweise darin enthaltenene Unterordner in eine ZIP-Datei packen kann. Bei meiner Lazarus-Version wurde eine Unit Zipper mitgeliefert. Aber ich finde nirgends Beispielcode dafür. auch in den bei Lazarus mitgelieferten Beispielen habe ich nichts zum Zipper gefunden. Kennt jemand vielleicht Beispielcode diese Komonente?

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Zipper

Beitrag von shokwave »

Hi,

ich hatte mir mal zum testen eine Unit gebastelt, die sollte als Beispielcode taugen.
Dateianhänge
archelper.pas
(3.81 KiB) 86-mal heruntergeladen
mfg Ingo

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zipper

Beitrag von Michl »

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Zipper

Beitrag von Andromeda »

ich habe es jetzt mal so probiert:

Code: Alles auswählen

 
procedure TFormHaupt.Button1Click(Sender: TObject);
var
  MeinZipper : TZipper;  // benötigt Uses Zipper
begin
  MeinZipper := TZipper.Create;
  MeinZipper.Entries.AddFileEntry('C:\Users\User\Documents\Lazarus\Projekte\Zip\ziptest.lpi', 'Testzip.zip');
end;
 

Es erscheint zwar keine Fehlermeldung, aber die Datei "Testzip.zip' kann ich auch nirgends finden. Muss die Datei zuerst angelegt werden? Oder was mache ich falsch?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zipper

Beitrag von Michl »

Parameter von AddFileEntry:
ADiskFileName (die zu packende Datei mit Pfad)
AArchiveFileName (der Dateiname mit Pfad in dem Archiv)

Nun musst du noch das Zip erstellen (so oder wie im Wiki beschrieben):

Code: Alles auswählen

begin
  MeinZipper := TZipper.Create;
  MeinZipper.Entries.AddFileEntry('C:\Users\User\Documents\Lazarus\Projekte\Zip\ziptest.lpi'{, 'Testzip.zip'});
  if MeinZipper.Entries.Count > 0 then
    MeinZipper.SaveToFile('Testzip.zip');
  MeinZipper.Free;
end;
Das Ganze noch in einen Try-Except-Block und schon sollte es passen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Zipper

Beitrag von Warf »

Michl hat geschrieben:Parameter von AddFileEntry:
ADiskFileName (die zu packende Datei mit Pfad)
AArchiveFileName (der Dateiname mit Pfad in dem Archiv)

Nun musst du noch das Zip erstellen (so oder wie im Wiki beschrieben):

Code: Alles auswählen

begin
  MeinZipper := TZipper.Create;
  MeinZipper.Entries.AddFileEntry('C:\Users\User\Documents\Lazarus\Projekte\Zip\ziptest.lpi'{, 'Testzip.zip'});
  if MeinZipper.Entries.Count > 0 then
    MeinZipper.SaveToFile('Testzip.zip');
  MeinZipper.Free;
end;
Das Ganze noch in einen Try-Except-Block und schon sollte es passen.


Das könnte Problematisch werden, da dann im Zip Archiv intern ein Pfad mit C:\ losgehen würde, und dir die meisten Zip Programme das dann nicht mehr finden können. Ich würde es so machen:

Code: Alles auswählen

begin
  MeinZipper := TZipper.Create;
  MeinZipper.Entries.AddFileEntry(path, CreateRelativePath(path, ExtractFileDir(path))); // benötigt uses LazFileUtils
  if MeinZipper.Entries.Count > 0 then
    MeinZipper.SaveToFile('Testzip.zip');
  MeinZipper.Free;
end;

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zipper

Beitrag von Michl »

Recht hast du. War mir noch gar nicht aufgefallen. Ich nutze hauptsächlich den TotalCommander, der kann so ein Zip öffen, der Windows Explorer nicht.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Zipper

Beitrag von Andromeda »

ich mach das jetzt so, wie Warf das vorgeschlagen hat, und es funktioniert einwandfrei. Vielen Dank @Warf. Aber ein kleines Problem habe ich noch: Die Dateien, die gepackt werden sollen, trage ich über einen OpenDialog in eine Listbox ein. Der Zipper holt sich die Dateien also aus der Listbox. Aber irgendwie schaffe ich es nicht, auch Verzeichnisse in die Listbox einzutragen. Ich habe mir schon sämtliche Optionen beim OpenDialog angeschaut, finde aber keine entsprechende Einstellung. Stell ich mich da nur zu dämlich an? Das muss doch irgendwie auch gehen. Oder?

Antworten