Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [Abbrevia] Es wird immer wieder neues Archive erstellt (https://www.delphipraxis.net/151578-%5Babbrevia%5D-es-wird-immer-wieder-neues-archive-erstellt.html)

-Phantom- 23. Mai 2010 22:55


[Abbrevia] Es wird immer wieder neues Archive erstellt
 
Hey Leute,

Ich versuche grade ein .cab Archive zu erstellen und das so:
Delphi-Quellcode:
procedure Tform4.cab(CabS : String);
var
datei : String;
begin
form2.AbMakeCab1.FileName := Cabs;
form2.AbMakeCab1.OpenArchive(cabs);
datei := Extractfilename(neupfad);
form2.AbMakeCab1.AddFiles(datei,0);
form2.AbMakeCab1.CloseArchive;
//Der Aufruf
Delphi-Quellcode:
procedure TForm4.sButton2Click(Sender: TObject);
{...}
cab(neupfad+'.cab');
{...}
end;
Das Archive wird auch erstellt soweit so gut.

Nun will ich mehr Dateien einfügen und das so:
Delphi-Quellcode:
opendialog2.Execute;
i2 := opendialog2.Files.Count;
for i := 0 to i2-1 do begin
neudatei := Extractfilename(opendialog2.Files[i]);
item := slistview2.Items.Add;
item.Caption := neudatei;
item.SubItems.Add(Extractfilename(neupfad)+'\'+neudatei);
abmakecab1.FileName := neupfad+'.cab';
abmakecab1.AddFiles(Extractfilename(opendialog2.Files[i]),0);
abmakecab1.CloseArchive;
Aber im Archive ist immer nur 1 Datei, ich kann so viele einfügen wie ich will immer nur eine :wall:
Ich glaube, das sich das Archive immer wieder neu erstellt.
Wisst ihr was das Problem ist?

PS: Bei den Beispielen von Abbrevia habe ich nichts brauchbares gefunden

----------------------------------------------------------------------

Gruß

Mathias

Matze 23. Mai 2010 23:05

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Hallo Mathias,

ich kenne Abbrevia nicht, aber für mich erscheint das Ganze nur dann logisch, wenn "AddFiles" in der Schleife aufgerufen wird. "CloseArchive" schreibt vermutlich das Archiv auf die Festplatte (wie bei CloseFile) und damit überschreibst du das Archiv ständig.

Versuche also, nur "AddFiles" in deiner For-Schleife aufzurufen

Delphi-Quellcode:
AbMakeCab1.OpenArchive(cabs);
for i := 0 to OpenDialog2.Files.Count - 1 do
begin
  AbMakeCab1.AddFiles(OpenDialog2.Files[i], 0);
end;
AbMakeCab1.CloseArchive;
Aber das ist nur eine Vermutung.

Ich denke auch, dass du der Methode "AddFiles" einen absoluten Dateipfad übergeben solltest. Relative Pfade sind immer kritisch, da du nie weißt, auf welches Verzeichnis sie sich beziehen (siehe meinen Beispielcode).

Grüße
Matthias

Nachtrag: Ich liege übrigens richtig, wie die Beispiele von Abbrevia zeigen:

Delphi-Quellcode:
// Quelle: /examples/MakeCab1.pas

if OpenDialog1.Execute then
  if (OpenDialog1.Files.Count > 0) then begin
    // ...
    FileList := TStringList.Create;
    try
      FileList.Assign(OpenDialog1.Files);
      for i := 0 to Pred(FileList.Count) do
        AbMakeCab1.AddFiles(FileList.Strings[i], 0);
    finally
      FileList.Free;
    end;
    // ...
  end;
Mein Code von oben müsste auch funktionieren.

-Phantom- 23. Mai 2010 23:52

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Danke dir Matthias

Es lag aber nicht an dem abmakecab.close sondern abmakecab.filename := ...

So nun meine Lösung:
Das mit dem Cabs{..} ganz weg lassen
Man erstellt nun die Datei beim einfügen der ersten Datei :
Delphi-Quellcode:
opendialog2.Execute;
abmakecab1.FileName := neupfad+'.cab'; // das darf nicht mit in die Schleife
i2 := opendialog2.Files.Count;
for i := 0 to i2-1 do begin
neudatei := Extractfilename(opendialog2.Files[i]);
item := slistview2.Items.Add;
item.Caption := neudatei;
item.SubItems.Add(Extractfilename(neupfad)+'\'+neudatei);
abmakecab1.AddFiles(Extractfilename(opendialog2.Files[i]),0);
abmakecab1.CloseArchive;
end;
Gruß Mathias

// Hätte eher nachfragen müssen, hab nun 2 1/2 an dem Problem gesessen. ^^

Luckie 24. Mai 2010 00:05

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Aber ich bin auch der Meinung, dass das CloseArchive aus der Schleife raus muss.

-Phantom- 24. Mai 2010 02:18

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Ja ich hab es nun auch gemacht aber das Problem ist doch noch nicht ganz weg.
Nun werden zwar mehrere Dateien in das Archive gepackt aber immer wenn man auf den Button drauf drückt wird das wieder überschrieben
Delphi-Quellcode:
procedure TForm2.sBitBtn8Click(Sender: TObject);
{...}

if (label1.Caption = 'Neu') and (neuendung = '.cab') then begin
opendialog2.Execute;
abmakecab1.FileName := neupfad+neuendung; bzw.{abmakecab1.openarchive(neupfad+'.cab');} // Hier wird das immer überschrieben
i2 := opendialog2.Files.Count;
for i := 0 to i2-1 do begin
neudatei := Extractfilename(opendialog2.Files[i]);
item := slistview2.Items.Add;
item.Caption := neudatei;
item.SubItems.Add(Extractfilename(neupfad)+'\'+neudatei);
//item.SubItems.Add(inttostr(abmakecab1.Items[i].CompressedSize)+' B');
abmakecab1.AddFiles(Extractfilename(opendialog2.Files[i]),0);
end;
abmakecab1.CloseArchive;
end;
Also immer wenn man auf den Button drück wird ein neues Archive erstellt, was ja nicht soll
wie verhindere ich das? Wenn ich Abmakecab1.filename außerhalb der If-Abfrage habe kommt die Meldung "Archive Filename ist Blank",
nun was ich auch komisch finde ist, dass das geht :
Delphi-Quellcode:
if (label1.Caption = 'Neu') and (neuendung = '.zip') then begin
opendialog2.Execute;
abzipper1.OpenArchive(neupfad+neuendung);
i2 := opendialog2.Files.Count;
for i := 0 to i2-1 do begin
neudatei := Extractfilename(opendialog2.Files[i]);
item := slistview2.Items.Add;
item.Caption := neudatei;
item.SubItems.Add(Extractfilename(neupfad)+'\'+neudatei);
//item.SubItems.Add(inttostr(abzipper1.Items[i].CompressedSize)+ ' B');
abzipper1.AddFiles(Extractfilename(opendialog2.Files[i]),0);
end;
abzipper1.CloseArchive;
end;
// Mit .zip Endung klappt alles Prima.

Tryer 24. Mai 2010 08:00

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Das ganze ist nur solange komisch bis man die Doku gelesen hat, da steht klar drin das die Möglichkeiten bei Cabinetdateien eingeschränkt sind. (..no eqivalent to delete, freshen, and replace operations with zip files..)

Grüsse, Dirk

Matze 24. Mai 2010 08:16

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Und weshalb nutzt du überall "ExtractFileName"?
Ich schrieb doch oben, dass relative Pfade Mist sind. Lass diesen Funktionsaufruf einfach weg, sonst bereitet er dir irgendwann noch Probleme.

-Phantom- 24. Mai 2010 10:48

Re: [Abbrevia] Es wird immer wieder neues Archive erstellt
 
Ich kann das ja auch weg lassen bring aber nicht viel. Dann lass ich .cab wohl aus dem Programm raus...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz