AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte VPHD - Virtual private hard-disc
Thema durchsuchen
Ansicht
Themen-Optionen

VPHD - Virtual private hard-disc

Ein Thema von olee · begonnen am 3. Jan 2012 · letzter Beitrag vom 23. Aug 2015
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    
Benutzerbild von olee
olee
Registriert seit: 16. Feb 2008
Hallöchen alle zusammen!

Habe mich lange Zeit nicht hier im Forum blicken lassen, da ich in letzter Zeit leider zu viel mit Uni (und zocken xD) zu tun hatte.
Aber ich dachte mir, dass ich das mal endlich hinter mich bringen sollte.
Naja lange Rede kurzer Sinn:

Ich möchte euch hier mein neustes (altes) Projekt VPHD vorstellen.

Bei diesem Tool handelt es sich wie der Name schon ausdrückt um eine art Archiv für Dateien zur sicheren Aufbewahrung.
Der große Unterschied und auch Vorteil dieses Programms im Gegensatz zu normalen verschlüsselten Archiven wie WinRar, 7zip und Co. ist, dass dieses Format auf sehr große Datenmengen und vor allem das häufig Hinzufügen, Löschen und Ändern von Daten ausgelegt ist.
Übliche Archive müssen bei jeder Veränderung des Inhaltes neu geschrieben werden, was bei einer Änderung einer kleinen Datei in einem etwa 2 GB dann schon mal so 10 minuten dauern kann.

Das Format von VPHD hingegen verhält sich, wie der Name schon sagt, mehr wie ein Dateisystem.
Der Vorteil ist, dass das Hinzufügen, Löschen und Ändern von Dateien nur so lange dauert, wie das schreiben eben dieser einen Datei.
Beim Löschen wird demnach nicht mehr gemacht als im Dateiindex des Containers der Speicherbereich der Datei als Frei markiert, ähnlich einer normalen Festplatte.
Diese Lücken werden dann nach und nach durch Hinzufügen neuer Dateien und eine einfache Optimierung nach und nach wieder gefüllt.

Die wichtigste Funktion von VPHD liegt jedoch in der (optionalen) Verschlüsselung von Containern.
Damit lassen sich beliebige Dateien in einem passwort-geschütztem Container aufbewahren, welcher sich jedoch ohne großen Aufwand schnell auslesen lässt.

Hier eine kleine Zusammenfassung der Features des Programms:
  • Einfaches Hinzufügen / Extrahieren von Dateien per Drag'n'Drop
  • Es lassen sich wahlweise verschlüsselte oder unverschlüsselte Container anlegen
  • Archive lassen sich in eine ausführbare Anwendung umwandeln, wodurch sich die Daten von überall her lesen lassen
    (Nur das Verändern in diesem Format geht noch nicht so einfach)
  • Das Programm ist (bisher) in Deutsch und Englisch verfügbar (ja nach Systemeinstellung)

Mit freundliche Grüßen
Björn Zeutzheim


PS: Hier die direkten Download-Links:
VPHD Setup (916 KB)
VPHD mit Sourcen (1.454 KB)
Codename: Performancepumpe

Geändert von olee (28. Jun 2015 um 00:40 Uhr)
 
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#11
  Alt 3. Jan 2012, 20:11
Dieser wird aber (wenn ich mich recht erinnere) nur zu gegebenem Anlass ausgeführt.
Und wann ist ein gegebener Anlass?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#12
  Alt 3. Jan 2012, 20:13
Ich habe gerade nachgekuckt und festgestellt, dass der Algorithmus doch nicht aufgerufen wird

Ich werde gleich eine Version hochladen wo dies automatisch geschieht.
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#13
  Alt 3. Jan 2012, 20:25
So.

Ich habe in der neuen Version die Defragmentierung wieder aktiviert.
Sie wird ausgeführt, sobald das Archiv geschlossen wird.

Mit freundlichen Grüßen
Björn Zeutzheim
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#14
  Alt 4. Jan 2012, 16:04
So, endlich ist es soweit fertig.
Ich habe nun das Projekt in eine DLL, über welche die VPHD-Bibliothek über ein Interface nutzen lässt, exportiert.
Damit sollte sich das Projekt auch in den meisten anderen Sprachen nutzen lassen.
Außerdem stellt so auch die Verwendung innerhalb einer Anwendung kein großes Problem mehr dar.
Es ist zwar noch nicht alles ganz ausgereift, aber laufen tuts wunderbar.
Zur Demonstration habe ich auch die Hauptanwendung (VPHD_Tool.exe) schnell mal auf die Verwendung der Bibliothek umgestellt, was sich ohne großen Aufwand umsetzen ließ.
Daher kann ich euch auch nun hier die Source zum Tool rausgeben.
(nicht aber die Sourcen der Bibliothek - das werde ich mir nochmal überlegen - bzw auf Nachfrage)

Die Downloads sind wie immer im ersten Post verlinkt.

Mit freundlichen Grüßen
Björn Zeutzheim
Björn Zeutzheim
  Mit Zitat antworten Zitat
neo4a

 
Delphi XE2 Architect
 
#15
  Alt 4. Jan 2012, 16:53
Ich habe mir Dein Projekt bereits angeschaut und bin sehr beeindruckt, wie schnell Du mit der DLL all die hier geäußerten Wünsche und Anregungen "erschlagen" konntest.

Vielen Dank dafür!
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#16
  Alt 4. Jan 2012, 17:00
Nun ja...
eigentlich war das ganze nicht so schwer wie erwartet ^^

Der Trick war folgender:
Das Projekt von VPHD besteht im Grunde aus einer einzigen Hauptklasse.
Diese habe ich nun so abgeändert, dass ich dazu ein Interface (IVphd) mit allen public Methoden anlegen konnte. Dazu musste ich im Grunde nur die ganze Klasse kopieren, interface drüber schreiben, alle nicht-public felder rauslöschen und für ein paar public-variablen noch getter und setter anlegen.

Damit das ganze nun auch als DLL nutzbar ist habe ich dann noch ein paar kleine Methoden geschrieben, welche exportiert werden. So z.B. zum öffnen / erstellen eines Archives:
Delphi-Quellcode:
function OpenVphdFile(const FileName, Password: PWideChar; CreateNew: Boolean): IVphd; stdcall;
begin
  Result := TVPHD.Create(FileName, Password, CreateNew);
end;
Diese Funktion gibt dann am ende der Anwendung ein IVphd-Interface zurück, welches sich im Grunde fast exakt wie die normale Klasse verwänden lässt.
Zuletzt war es noch nötig ale WideStrings in den Methoden des Interfaces durch PWideChar (mit daraus folgenden Code-Anpassungen) zu ersetzen und natürlich an alle Methoden stdcall dranhängen.
Das wars dann auch schon im Großen und Ganzen.

Hier mal als Beispiel das ganze Interface:
Delphi-Quellcode:
  IVPHD = interface (IInterface)
    ['{3D6C8AAE-0CED-4D71-A1E2-26D2CCD0E8A5}']
  {$REGION 'File management'}
    procedure BeginUpdate; stdcall;
    procedure EndUpdate; stdcall;
    function GetDirectory(APath: PWideChar; DoCreate: Boolean): PDirNode; stdcall;
    function GetDirectoryFile(APath: PWideChar; var FileID: Integer): PDirNode; stdcall;
    function GetFile(AFileName: PWideChar): Integer; overload; stdcall;
    function GetFile(Dir: PDirNode; AName: PWideChar): Integer; overload; stdcall;
    //==============================================================================
    procedure AddFile(const AFileName: PWideChar; Data: TStream;
      FileDate: TDateTime); overload; stdcall;
    procedure AddFile(ARoot, AFileName: PWideChar); overload; stdcall;
    //==============================================================================
    procedure ExtractDir(Dir: PDirNode; DstPath: PWideChar); stdcall;
    procedure ExtractAll(DstPath: PWideChar); stdcall;
    procedure ExtractFile(FileID : Integer; const DstFile: PWideChar); overload; stdcall;
    procedure ExtractFile(FileID : Integer; DstStream: TStream); overload; stdcall;
    //==============================================================================
    procedure ExtractFileStart(FileID: Integer); stdcall;
    function ExtractFilePart(Dst: TStream; Count: Integer): Integer; stdcall;
    function ExtractFilePartBuff(var Data; Count: Integer): Integer; stdcall;
    procedure ExtractFileEnd; stdcall;
    //==============================================================================
    procedure DeleteFile(FileID: Integer); stdcall;
    procedure DeleteDir(Dir: PDirNode); stdcall;
    procedure RenameFile(FileID : Integer; ANewName: PWideChar); stdcall;
    procedure RenameDir(Dir: PDirNode; ANewName: PWideChar); stdcall;
  {$ENDREGION}
    procedure DrawFragmentationBar(DstDC: HDC; Width, Height: Integer;
      DrawStyle : TFragBarDrawStyle); stdcall;

    procedure SaveAs(const AFileName: PWideChar); overload; stdcall;
    procedure SaveAs(AStream: TStream); overload; stdcall;
    procedure Defragment; stdcall;
    procedure Finish; stdcall;

    function GetFileCount: Integer; stdcall;
    function GetFile(Index: Integer): PVphdFileInfo; overload; stdcall;
    property FileList[Index: Integer]: PVphdFileInfo read GetFile;

    function GetUpdating: Boolean; stdcall;
    function GetProgressFile: PWideChar; stdcall;
    procedure SetProgressFile(v: PWideChar); stdcall;
    function GetOwnStream: Boolean; stdcall;
    procedure SetOwnStream(v: Boolean); stdcall;
    function GetEOF: Int64; stdcall;
    function GetDescription: PWideChar; stdcall;
    procedure SetDescription(v: PWideChar); stdcall;
    function GetFileName: PWideChar; stdcall;
    function GetOnProgress: TVphdProgressEvent; stdcall;
    procedure SetOnProgress(v: TVphdProgressEvent); stdcall;

    property Updating: Boolean read GetUpdating;
    property ProgressFile: PWideChar read GetProgressFile write SetProgressFile;
    property OwnStream: Boolean read GetOwnStream write SetOwnStream;
    property Description: PWideChar read GetDescription write SetDescription;
    property FileName: PWideChar read GetFileName;
    property EOF: Int64 read GetEOF;
    property OnProgress: TVphdProgressEvent read GetOnProgress write SetOnProgress;
  end;
Wenn man sich von der Hauptanwendung (VPHD_Tool.exe) mal die Source anschaut sieht man auch, dass der Unterschied zwischen der Nutzung über das Interface und als normale Klasse wirklich minimal ist (lässt sich nun durch einen kleinen Compilerschalter umstellen).

MFG
Björn Zeutzheim
Björn Zeutzheim

Geändert von olee ( 4. Jan 2012 um 17:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#17
  Alt 4. Jan 2012, 17:01
Ich habe mir Dein Projekt bereits angeschaut und bin sehr beeindruckt, wie schnell Du mit der DLL all die hier geäußerten Wünsche und Anregungen "erschlagen" konntest.
Das ist Zeichen für ein gutes Konzelpt und sauberer Programmierung.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#18
  Alt 4. Jan 2012, 17:08
Danke

Aber ich muss noch dran arbeiten.

Auf meiner TODO-Liste steht vor allem noch ein wichtiger Punkt:

Das auslesen von Dateien soll noch besser realisiert werden. Vor allem ist es mein Ziel, eine Funktion zu schreiben, welche einen speziellen Stream zurückgibt, mit welchem man eine Datei Stück für Stück aus dem Archiv auslesen kann. Das ist nicht gerade einfach und bedarf noch einiger Anpassung. Was jedoch bisher möglich ist, ist das Stückweise Auslesen mittels der 3 Funktionen:
Delphi-Quellcode:
procedure ExtractFileStart(FileID: Integer); stdcall;
function ExtractFilePart(Dst: TStream; Count: Integer): Integer; stdcall;
function ExtractFilePartBuff(var Data; Count: Integer): Integer; stdcall;
procedure ExtractFileEnd; stdcall;
PS: Der nächste Punkt auf meiner TODO-Liste ist aktuell aber die Implementation einer Kommandozeile.
Ergebnisse sind in ca. einer Stunde zu erwarten, falls ich nicht ne Runde zocke xD

EDIT:
Eine kleine Bemerkung am Rande:
Ich habe im Laufe der Entwicklung auch eine extra Testanwendung geschrieben, welche die Library einem Stresstest unterzieht.
Dabei wurden tausende von Dateien kunterbunt hinzugefügt und gelöscht und dabei immer wieder die Datenintegrität (über Hashes der Zufallsdaten) geprüft.
Dadurch wurden alle Fehler beseitigt und die Sicherheit des Formates überprüft (also keine Memory-leaks bzw. Dateninkonsistenzen).
Außerdem habe ich dabei den gesamten Code auf höchste Performance optimiert.

EDIT #2:
Eine weitere Bemerkung:
Das ganze Projekt ist durch Nutzung der TNT-Unicode-Controls Unicode-fähig!
(Ist zwar ein etwas böser Hack, aber der Nutzen ist enorm ^^)
Ich würde die DLL ja gerne ohne diesen Hack kompilieren, doch leider habe ich nur Turbo Delphi.
Ich werde aber mal sehen ob ich zumindest für die DLL nicht eine bessere Lösung finde....
Jetzt wo ich so darüber nachdenke, würde es reichen, nur ein paar wenige Klassen und Methoden aus den TNT-units zu nehmen, anstatt gleich alles mit reinzunehmen...
Björn Zeutzheim

Geändert von olee ( 4. Jan 2012 um 17:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

 
Turbo Delphi für Win32
 
#19
  Alt 4. Jan 2012, 23:28
So.

Wie versprochen habe ich nun die Konsolenversion implementiert.

Der Download befindet sich wie gehabt im ersten Post.

Für eine Hilfe zur Verwendung der Konsolenanwendung diese mit dem Parameter "/help" oder "/?" aufrufen.

MFG
Björn Zeutzheim
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#20
  Alt 5. Jan 2012, 04:25
Muss ich mir mal genauer angucken, ob das reicht. Weil es wäre gut, wenn man noch Dateien (auch mit Wildcards) und Verzeichnisse ausschließen könnte. Und muss man, wenn man ein Verzeichnis hinzufügt auch einen Pfad im Archiv angeben?
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    

 

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 14:35 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