AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TArchive - Klasse um mehrere Dateien zusammen zu fassen
Thema durchsuchen
Ansicht
Themen-Optionen

TArchive - Klasse um mehrere Dateien zusammen zu fassen

Ein Thema von Luckie · begonnen am 16. Jul 2004 · letzter Beitrag vom 19. Jul 2004
Antwort Antwort
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
TArchive ist eine Klasse, um beliebig viele Datein zu einer zusammenzufassen. Man kann dann entweder gezielt eine Datei extrahieren oder alle in einem Rutsch.

Aufbau der Archivdatei:
Delphi-Quellcode:
{************************************************************

  Archive format:

  4 Byts                  : Number of Files in archive
  4 Bytes * sizeof(Int64)  : Size of files in archive
  255 * sizeof(Int64)      : Filenames of files in archive
  -                        : files in archive

************************************************************}
In den ersten vier Bytes steht die Anzahl der Dateien. Dann folgen die Dateigrößen der Dateien im Archiv und dann die Dateinamen. Und dann die Dateien selber.

Methoden der Klasse:
Delphi-Quellcode:
constructor Create(ArchiveFile: string);
procedure AddFiles(Files: TStrings); // Fügt Dateien dem Archiv hinzu
procedure Contents(var Files: TStrings); // Liest die Dateinemane der enthaltenen Dateien aus
procedure ExtractSingleFile(Index: Integer; Dir: string); // extrahier eine einzelne Datei
procedure ExtractAll(Dir: string); // extrahier alle Dateien
Was die Klasse noch nicht kann:
Zu einem bestehenden Archiv neue Dateien hinzufügen.
Dateien aus dem Archiv entfernen.
Die Pfade werden nicht mitgespeichert.
Keine Fortschrittsanzeige.

Die ersten beiden Punkte liessen sich aber über den Umweg, des erst Extrahierens und dann des neu Zusammenstellens lösen.
Der letzte Punkt liesse sich mit hilfe des StreamProgressAdapeters (Auch auf meiner HP zu finden.) lösen.

Ein Demo Projekt liegt bei.

Download: TArchive1_0.zip [9 KBytes]

Ist nix großes, aber eventuell kann sie ja der ein oder andere brauchen.
Ein Teil meines Codes würde euch verunsichern.
 
Benutzerbild von Spezi1980
Spezi1980

 
Delphi 2005 Personal
 
#2
  Alt 16. Jul 2004, 07:52
hallo,
wie sieht das aus mit den Dateiattributen der Orginaldateien, werden die mit einbezogen?

Ich frag nur, weil die ja nicht im Header sind und es ja sein kann dass du die mit der einzelnen Datei einbindest.

Um das nachträgliche hinzufügen und löschen von Dateien zu vereinfachen könnte man auch dien "Archivkopf" (in umgekehrter Reihenfolge) hinten anhängen und jedesmal neu schreiben. Nachteil dabei ist aber, dass bei Schreibproblemen in das Archiv alle bisher geschriebenen Dateien verloren gehen, wenn der "Archivkopf" noch nicht mit gespeichert ist.


Gruß
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#3
  Alt 16. Jul 2004, 16:56
Neue Version ist online, die soweit fertige. Jetzt mit Fortschrittsanzeige und die Klasse habe ich etwas imstrukturiert.

Downloadlink siehe oben.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#4
  Alt 16. Jul 2004, 18:59
Hi,

ein kleiner Tipp von mir:

Undzwar könntest du vor alle Strings in den Methoden-Parametern ein const davor setzen.
Wenn du den String nicht änderst, wird der Code durch das const schneller, weil sich Delphi dann den zusätzlichen Kram mit der String-Referenzzählung sparen kann.

Wozu brauchst du sonst noch das var vor TStrings in der Methode Contents? Ich würde das einfach weglassen und in der Methode einfach auf Assigned(Files) prüfen. Um das erstellen und freigeben der Liste sollte sich dann der User kümmern.
Edit: Bei AddFiles hast du es doch auch nicht

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#5
  Alt 16. Jul 2004, 20:16
Zitat von mirage228:
Wozu brauchst du sonst noch das var vor TStrings in der Methode Contents?
Bei welcher Version bist du?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

 
Delphi 2010 Professional
 
#6
  Alt 17. Jul 2004, 07:41
Zitat von Luckie:
Zitat von mirage228:
Wozu brauchst du sonst noch das var vor TStrings in der Methode Contents?
Bei welcher Version bist du?
Hi,

ist es denn schon geändert?
Denn in deinem Ausgangsposting steht noch ein var davor.

mfG
mirage228
David F.
  Mit Zitat antworten Zitat
Jörn
 
#7
  Alt 17. Jul 2004, 18:29
Goile Sache, so was hab ich gebraucht!! Vielen Dank Luckie bist ein Schatz *gg*
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#8
  Alt 19. Jul 2004, 02:46
So, wie oben schon gesagt, habe ich die Struktur der Klasse etwas geändert und zusätzlich noch einen Fortschritt eingebaut und die Möglichleit das ganze abzubrechen.

Die öffentlichen Methoden den Klasse sehen jetzt so aus:
Delphi-Quellcode:
    constructor Create(const ArchiveFile: string);
    procedure AddFiles(Files: TStrings); // Dateinhinzufügen
    property FileCount: Cardinal read GetFileCount; // Datein im Archiv ermitteln
    property Contents: TStrings read GetContents; // Inhalt des Archives
    procedure ExtractSingleFile(Index: Integer; const Dir: string); // einzelne Datei extrahieren.
    procedure ExtractAll(const Dir: string); // alle Dateien extrahieren (ruft ExtractSingleFile auf ;) )
    property OnTotalProgress: TOnTotalProgress read FOnTotalProgress write
      FOnTotalProgress; // gesamt Fortschritt
    property OnFileProgress: TOnFileProgress read FOnFileProgress write
      FOnFileProgress; // Fortschritt in der Datei
Downloadlink siehe oben.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 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