AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte SFX Builder
Thema durchsuchen
Ansicht
Themen-Optionen

SFX Builder

Ein Thema von Luckie · begonnen am 25. Sep 2007 · letzter Beitrag vom 26. Sep 2007
Antwort Antwort
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
SFX Builder

Angeregt durch diesen Thread self extract, habe ich noch mal meine SFX-Tools hervorgekramt und noch mal gänzlich neu programmiert. Nach vier Jahren mehr an Programmiererfahrung, sieht der Code doch etwas anderes aus. Damals wollte ich nur wissen, wie so etwas gehen könnte und habe es mehr schlecht als recht auch hinbekommen. Der zweite Versuch, vier Jahre später, ist da schon besser gelungen, was das Design des Codes und den Code selber angeht.

Der SFX Builder besteht aus zwei Exe-Dateien, dem Builder selber, der das Archiv erstellt und der SFXStub an dem die Dateien angehangen werden und der den Code zum Entpacken beinhaltet. Der Code besteht aus drei zentralen Klassen:
Delphi-Quellcode:
  TFile = class(TObject)
  private
    FFilename: String;
    FFileSize: Int64;
    FOffset: Int64;
    function GetFilename: String;
    procedure SetFilename(const Value: String);
    function GetFileSize: Int64;
    procedure SetFileSize(const Value: Int64);
    function GetOffSet: Int64;
    procedure SetOffSet(const Value: Int64);
  public
    property Filename: String read GetFilename write SetFilename;
    property FileSize: Int64 read GetFileSize write SetFileSize;
    property OffSet: Int64 read GetOffSet write SetOffSet;
  end;
Die Klasse TFile repräsentiert eine Datei mit den Eigenschaften: Dateiname, -größe und Offset, der angibt an welcher Position sich die Datei im Archiv befindet. Damit wäre es ohne weiteres möglich eine Datei gezielt zu entpacken, ohne alle entpacken zu müssen.

Delphi-Quellcode:
TFileContainer = class(TList)
  private
    FFileList: TList;
    FOffSet: Int64;
    FTotalSize: Int64;
    function GetItem(Index: Integer): TFile;
    procedure SetItem(Index: Integer; FileObject: TFile);
  public
    constructor Create;
    destructor Destroy; override;
    property Items[Index: Integer]: TFile read GetItem write SetItem;
    procedure Add(FileObject: TFile);
    procedure Clear; override;
    function Count: Integer;
    property OffSet: Int64 read FOffSet write FOffSet;
    property TotalSize: Int64 read FTotalSize write FTotalSize;
  end;
Die Klasse TFileContainer verwaltet alle Objekte vom Typ TFile in einer Liste.

Delphi-Quellcode:
  TTOCEntry = packed record
    Filename: string[255];
    FileSize: Int64;
    OffSet: Int64;
  end;

  TOnAppendTOC = procedure(Sender: TObject) of object;
  TOnAppendFile = procedure(Sender: TObject; Index: Integer; FileObject: TFile) of object;
  TOnAppendingFile = procedure(Sender: TObject; FileObject: TFile; PercentDone: Integer) of object;
  TOnExtractFile = procedure(Sender: TObject; Index: Integer; FileObject: TFile) of object;
  TOnExtractingFile = procedure(Sender: TObject; FileObject: TFile; PercentDone: Integer) of object;

  TSFX = class(TObject)
  private
    FFilename: string;
    FStubFileSize: Integer;
    FRoot: string;
    FFileList: TFileContainer;
    FTOC: array of TTOCEntry;
    FCancel: Boolean;
    FOnAppendTOC: TOnAppendTOC;
    FOnAppendFile: TOnAppendFile;
    FOnAppendingFile: TOnAppendingFile;
    FOnExtractFile: TOnExtractFile;
    FOnExtractingFile: TOnExtractingFile;
    procedure CreateTOC;
  public
    constructor Create(Filename: string; Root: string; FileList: TFileContainer);
    procedure AppendFiles;
    procedure AppendTOC;
    procedure ReadTOC;
    procedure ExtractFiles;
    procedure CopyStub(Source, Dest: string);
    property Cancel: Boolean read FCancel write FCancel;
    property OnAppendTOC: TOnAppendTOC read FOnAppendTOC write FOnAppendTOC;
    property OnAppendFile: TOnAppendFile read FOnAppendFile write FOnAppendFile;
    property OnAppendingFile: TOnAppendingFile read FOnAppendingFile write FOnAppendingFile;
    property OnExtractFile: TOnExtractFile read FOnExtractFile write FOnExtractFile;
    property OnExtractingFile: TOnExtractingFile read FOnExtractingFile write FOnExtractingFile;
  end;
Und schließlich die Klasse TSFX selber, die das Erzeugen und das Entpacken des Archivs selber übernimmt. Beim Erstellen werden alle Dateien aus der Liste an die Exe zum Entpacken angehangen. Dann wird ein Inhaltsverzeichnis erstellt, welches nur ein dynamisches Array vom Typ TTOCEntry ist, welches dann auch angehangen wird. Und zum Schluss wird noch die Größe des Inhaltsverzeichnisses und die Größe der Exe zum Entpacken angehangen.
Das Extrahieren geschieht in umgekehrter Reihenfolge. Erst wird das Inhaltsverzeichnis gelesen, dann die Dateiliste erstellt und schliesslich werden an Hand der Dateiliste die Dateien extrahiert.

Das alles geschieht erstmal nur ohne Kompression, welche das ganze natürlich noch etwas verkompliziert. Ich muss mal sehen, ob ich mir noch die Mühe mache und mir dazu noch etwas einfallen lasse. Bis dahin, kann man das Projekt mehr als HowTo ansehen, als ein wirkliche Projekt, was von Nutzen ist. Desweiteren wäre zu überlegen, ob man noch eine Auswahl von Dateien beim Packen zulässt und es ermöglicht, gezielt nur ausgewählte Dateien zu extrahieren. Dazu müsste man beim Extrahieren die Klasse TSFX noch um eine Suchfunktion erweitern die eine bestimmte Datei im Archiv lokalisiert. Hat man sie erstmal gefunden, ist es kein Problem mehr sie zu extrahiere: Man kennt den Namen, die Größe und weiß an welcher Stelle im Archiv sie sich befindet an Hand des Offsets.

Bisher scheint alles zu funktionieren. Hat man allerdings ein sehr großes Archiv erstellt, meherer MB, mus sman eine weile warten, weil das Betriebssytem anscheinend eine Weile braucht, um alle offnen Handle zu schliessen, warum auch immer.

Ihr könnt es euch ja mal angucken. Allerdings Featurerequests werde ich erstmal nichtannehmen, da das ganze für mich erst mal nur ein HowTo ist. Hinzukommt, dass jedes herkömmliche Packprogramm selbst-entpackende Archive erstellen kann und das wahrscheinlich besser und effizienter, als ich es hinbekommen würde.
Angehängte Dateien
Dateityp: zip sfxbuilder_101.zip (107,4 KB, 57x aufgerufen)
Ein Teil meines Codes würde euch verunsichern.
 
Benutzerbild von lbccaleb
lbccaleb

 
Delphi 7 Enterprise
 
#2
  Alt 25. Sep 2007, 21:29
ich hab mal kurz durch gesehen, hast aber noch keine packmethode mit eingebaut???!!! das währe ja noch was, was gut geeignet währe für die zukunft!!??

fehler traten so erstmal nicht auf...
wichtig währe vllt noch im builder das hinzufügen und entfernen einzelner dateien... so wie das auswählen von den dateien die man entpackt haben will in der stub datei....

aber sonnst super prg
Martin
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#3
  Alt 26. Sep 2007, 08:31
Ich sehe du hast den dritt letzen Absatz gelesen und auch verstanden.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

 
Delphi 7 Enterprise
 
#4
  Alt 26. Sep 2007, 11:01
ja ich hab erst das proggy getestet, das mach ich meistens!!! naja erklärt viel was oft im text steht, wie hier auch

naja egal, aber hab da mal ne frage zu function TSFXStub.MakeProcInstance(M: TMethod): Pointer; was genau macht diese funktion??? gibt die den eintrittspunkt der exe zurück oder wei?? sorry aber bin nicht so helle in asm ;-(
Martin
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#5
  Alt 26. Sep 2007, 12:08
Siehe hier: http://www.michael-puff.de/Developer...backMethod.php
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 08:15 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