![]() |
TZipFile und Add
Hallo Leute,
da ich TZipFile zum ersten Mal benutze, will ich zuerst üben. Ich stelle fest, dass ich mit Add eine Datei, auch mehrmals, zu einem Archiv hinzufüge. Das Aktualisieren, das bedeutet überschreiben einer vorhandenen Datei ist nicht möglich, ist das richtig? Ich stelle weiter fest, dass Dateien unter dem gleichen Namen mehrmals auftauchen können, ich kann sie also über den Namen nicht alle ansprechen! (ich weiß, es geht über den Index) Nochmal meine Frage: kann ich eine vorhandene Datei im Archiv überschreiben? Etwas Code:
Delphi-Quellcode:
Gruß Willie.
procedure TForm1.Button2Click(Sender: TObject);
begin if fod.Execute then begin if fod2.Execute then begin with TZipfile.Create do try if IsValid(fod.FileName) then begin open(fod.FileName, zmReadWrite); Add(fod2.FileName); Close; end; finally Free; end; end; end; end; |
AW: TZipFile und Add
Du kannst natürlich auch ein "if Exists() IndexOf() >= 0 then Delete()" vor dein Add() packen, dann ist das wie ein überschreiben/updaten.
[edit] Ach du scheiße, die Delphiimplementation kann nur aufnehmen, aber nichts mehr löschen. [/edit] Über den Namen kommst natürlich nicht an alle "gleichnamigen" Einträge, aber via Index kann man auch noch zugreifen. |
AW: TZipFile und Add
Ein ZIP-File ist eine Abfolge von Streams zusammengehalten von einem Verzeichnis dafür. Einen Stream davon ersetzen ist nicht so einfach möglich, es sei denn man verschiebt die darauffolgenden Streams und passt die jeweiligen Verzeichniseinträge an. Das ist aber in vielen Fällen aufwändiger und langsamer als die Zip-Datei komplett neu zu erstellen.
Ich kann jetzt nicht für alle sprechen, aber einige ZIP-Programme erstellen für sowas eine temporäre Zip-Datei, löschen dann die alte und benennen die temporäre um. |
AW: TZipFile und Add
Danke Freunde für die schnellen Antworten.
Ein Zip-Archiv kann im Gegensatz zum Explorer mehrere Dateien mit dem gleichen Namen enthalten. Beim Auspacken wird man dann vor dem Überschreiben gefragt. Das habe ich gelernt. Ich muss erklären, warum ich ein Archiv benutze. Ich habe ein Zip-Archiv als einfaches Backup angelegt. Es enthält ca. 100 Dateien, deren aktuelle(=4) sich ständig ändern. Bisher habe ich das mit 7z oder dem Explorer gemacht. Ich möchte es jetzt in das Programm integrieren. (Speichern als Backup im Zip-Archiv). Ich habe gedacht, ich könnte das einfach überschreiben. Jetzt weiß ich, das geht nicht. Wie muss ich vorgehen?
Willie. |
AW: TZipFile und Add
Mit der Hauseigenen Klasse, mußt du die alte Zip lesend öffnen
und zugleich eine neue ZIP erstellen. Die unveränderten Dateien kopierst dann von der Einen in die Andere (kannst ja via MemoryStream innerhalb des Programms machen) und dann fügst deine neuen Dateien ein. Zuzüglich nachher/vorher noch die ZIP löschen/umbenennen, damit die neue ZIP den alten Namen bekommen kann. Alternativ hängst eben immer nur deine neuen Dateien an und bekommst dann das mit dem "soll überschrieben werden?" beim Entpacken. Im Prinzip hast so ja auch gleich ein Multibackup in einer Datei. (im Prinzip kann man sich da ja auch die alten Dateien noch rausholen) |
AW: TZipFile und Add
Zitat:
Zitat:
Jede Datei in meinem Archiv ist 2932 Bytes groß. |
AW: TZipFile und Add
Schau einfach mal die Extract/Add-Methoden an.
* entweder man nimmt einen Dateinamen oder einen TFileStream * oder man nehme eben einen TMemoryStream beim oldZip.Extract und gibt dann das direkt ins newZip.Add rein. (beim Kopieren ... geht mit dem Stream auch direkt von wo Anders im Programm) Erstmal kommt es drauf an, wie das Entpackprgramm arbeitet. Nutzt es den CentralHeader (Verzeichnis) am ZIP-Ende, dann wird dessen Reihenfolge genutzt (machen die meisten Programme) oder geht es einfach von vorne durch und nutzt die LocalHeader (es gibt ZIP-Programme, die den Stream/Datei mit minimalstem Speicher und schneller ohne hin-und-her-Positionieren durchgehen) z.B. beim Verarbeiten von ZIP über StdIn bzw. StdOut einer Consolenanwendung, da kann man nicht einfach wieder zurück und muß sequentiell arbeiten. Die LocalHeader und die Dateidaten werden nicht umsortiert und so weit ich das grad sehen konnte, wird auch der CentralHeader im TZipFile nicht sortiert. (der wird komplett neu geschrieben, da die neue Datei dort ans Ende aller Dateien eingefügt angehängt wird, vor den CentralHeader, welcher praktisch immer ganz am Ende liegt) Also ja * ohne Überschreiben bekommst das Älteste (was zuerst gespeichert wird / alles andere wird Ignoriert) * und mit Überschreiben das Neuste (was zuletzt gespeichert wurde) |
AW: TZipFile und Add
Ok, das sind gute Tipps.
wenn ich einfach nur anhänge, wird die Zip-Datei jedes Mal ca.. 3 KB größer. Ich denke, dass ist zu verkraften. Beim nächsten Auspacken, kommt sie wieder auf das normale Maß. Für das Bessere brauche ich Zeit. Ich bin langsam aber ich krieg das hin. Willie. |
AW: TZipFile und Add
Bist du wirklich auf Berlin Starter?
Falls ja evtl. überlegen auf 10.3 Community Edition zu wechseln? Nur Mal so, weil hier kürzlich schon Mal wer nix von CE wusste... |
AW: TZipFile und Add
Ja, würde gerne auf die CE umsteigen. Wg. Augen bin ich froh, wenn alles läuft. Ist die Installation einfach? Kann ich die beiden (SE und CE) neben einander laufen lassen. W.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz