AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Virtueller Zugriff auf Dateien

Ein Thema von freimatz · begonnen am 22. Nov 2024 · letzter Beitrag vom 4. Dez 2024
Antwort Antwort
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#1

Virtueller Zugriff auf Dateien

  Alt 22. Nov 2024, 19:46
Hallo zusammen,
für den Titel ist mir leider nicht allzu sinnvolles eingefallen. Worum gehts? Ich habe ein Stück Code, da wird mit Datenträger (z.B. CD-ROM) und Dateien gearbeitet. Da gibt es FindFirst, FindNext, GetDiskClass und weitere übliche functions und procedures für Dateien. Also alles nicht besonderes ungewöhnliches.
Nun möchte ich den Code nicht für Dateien auf CD-ROM oder Festplatte, sondern für Dateien in einer ISO- oder ZIP-Datei benutzen - und das ohne diese erst temporär wo hinzukopieren.

Vorstellen könnte ich mir einen Wrapper zu machen der alle diese Methoden ersetzt. In einem anderen Projekt habe ich so was schon gemacht, da ging es aber um die Testbarkeit mit Mocks. Ist es klar oder soll ich ein Beispiel erstellen?
Die eigentlichen Fragen: a) Gibt es schon sowas irgendwo? b) Gibt es bessere Ideen?

(Wie man auf Dateien einer ISO-Datei zugreift, da rum geht es hier: https://www.delphipraxis.net/216120-...-auslesen.html)
  Mit Zitat antworten Zitat
delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
277 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Virtueller Zugriff auf Dateien

  Alt 24. Nov 2024, 17:15
Beispiel erstellen oder Interfaces nehmen.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Virtueller Zugriff auf Dateien

  Alt 25. Nov 2024, 07:51
Hier nun ein Beispiel. Es ist nur für eine Funktion. Eine Klasse für ZIP-Dateien wäre anlog zu der für ISO.
Delphi-Quellcode:
unit FileWrapper;

interface

uses
  System.SysUtils;

type
  IFileWrapper = interface
    ['{18943149-C314-4003-BC7F-F50C3860804A}']
    function FileExists(const AFilename: string): Boolean;
  end;

  //Für ein standardmässiges Dateisystem
  TDefaultFileWrapper = class(TInterfacedObject, IFileWrapper)
  public
    function FileExists(const AFilename: string): Boolean;
  end;

  //Für eine ISO-Datei
  TIso8660FileWrapper = class(TInterfacedObject, IFileWrapper)
  public
    constructor Create(const AIsoFilenname: string);
    //True wenn Datei in der ISO-Datei existiert. Laufwerksbuchstabe wird ignoriert
    function FileExists(const AFilename: string): Boolean;
  end;

var
  //Ein FileWrapper für die üblichen Fälle
  DefaultFileWrapper: IFileWrapper;

implementation

function TDefaultFileWrapper.FileExists(const AFilename: string): Boolean;
begin
  Result := System.SysUtils.FileExists(AFilename);
end;

constructor TIso8660FileWrapper.Create(const AIsoFilenname: string);
begin
  inherited Create();
  //TODO : ISOLib einbinden
end;

function TIso8660FileWrapper.FileExists(const AFilename: string): Boolean;
begin
  Result := False; //TODO : implement FileExists
end;

//------------------------------------------------------------------------------
//Das ist nun ein extrem rudimentäres Beispiel für den alten Code
procedure AltVerarbeiteCD(ALaufwerksbuchstabe: Char);
begin
  if FileExists(ALaufwerksbuchstabe + '\setup.ini') then begin
    //Werte Dateien aus - sehr viele Dateioperationen
  end;
end;

//------------------------------------------------------------------------------
//Das wären die neue Methoden die den Wrapper benutzt.
//Alle Fileoperationen werden vorne mit "AFileWrapper." ergänzt
procedure NeuVerarbeite(
  AFileWrapper : IFileWrapper;
  ALaufwerksbuchstabe: Char);
begin
  if AFileWrapper.FileExists(ALaufwerksbuchstabe + '\setup.ini') then begin
    //Werte Dateien aus - sehr viele Dateioperationen
  end;
end;

procedure NeuVerarbeiteCD(ALaufwerksbuchstabe: Char);
begin
  NeuVerarbeite(DefaultFileWrapper, ALaufwerksbuchstabe);
end;

procedure NeuVerarbeiteIso(AIsoFilenname: string);
var
  Iso8660FileWrapper: IFileWrapper;
begin
  Iso8660FileWrapper := TIso8660FileWrapper.Create(AIsoFilenname);
  NeuVerarbeite(Iso8660FileWrapper, '-');
end;

initialization

DefaultFileWrapper := TDefaultFileWrapper.Create();

end.
Nochmals die Fragen: a) Gibt es schon sowas irgendwo? b) Gibt es bessere Ideen?
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
389 Beiträge
 
#4

AW: Virtueller Zugriff auf Dateien

  Alt 25. Nov 2024, 11:25
To my knowledge there is only one library did that full virtualization, and it is/was magnificent, it was called something (i don't recall to be honest) but it it was almost always a companied by another library called CallBack from Eldos, well there is no Eldos now, but CallBack is still there

https://www.callback.com/

The prices weren't cheap back in days, but now it seems way more expensive and more like nsoftware licensing system.


ps: I vaguely remember something like CallBack File Storage or something, the naming on the site reminding me.
Kas
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Virtueller Zugriff auf Dateien

  Alt 25. Nov 2024, 14:18
ZIP-Datei ist extrem einfach. Falls die Klassen aus Delphi nicht reichen, kann man das auch einfach in max. 20 Zeilen selbst schreiben. Hab ich letztens gemacht, da meine ZIP-Dateien einen obfuszierten Header haben konnten.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.114 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Virtueller Zugriff auf Dateien

  Alt 25. Nov 2024, 20:29
Um dann doch noch was Konstruktives beizutragen, hier der Code für eine eigene ZIP-Durchiteration:
- Beispielcode für ZIP Local Header (Wenn die Magische Zahl $03575157 ist, dann ist es die Datei eine obfuszierte Datei, für die dieses Tool ist. Diesen Code kannst du dir schenken. Neben dem Local Header gibt es noch zwei andere Arten von ZIP-Headern, die auch verpflichtend in jede ZIP-Datei aufzunehmen sind. Sie sind aber komplett nutzlos, weshalb sie zum Beispiel von 7-Zip ignoriert werden, egal ob sie fehlen, ungültig oder widersprüchlich sind. Ich habe herausgefunden, dass es Windows nicht egal ist, und du es durch Widersprüche in ZIP-Headern dazu bringen kannst, in Dauerschleife sinnlose Fehlermeldungen anzuzeigen, ohne dass der Benutzer erkennen kann, wo die herkommen.)
- Beispielcode für dessen Verwendung (Wichtig sind die ersten zwei Zeilen und vor allem die letzte Zeile.)
Kann man noch ein bisschen was einbauen, damit man bei einer ungültigen Datei nicht übers Ende hinaus liest.
Janni
2005 PE, 2009 PA, XE2 PA
  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:24 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-2025 by Thomas Breitkreuz