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 26. Nov 2024
Antwort Antwort
freimatz

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

Virtueller Zugriff auf Dateien

  Alt 22. Nov 2024, 20: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
274 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Virtueller Zugriff auf Dateien

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

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

AW: Virtueller Zugriff auf Dateien

  Alt Gestern, 08: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
353 Beiträge
 
#4

AW: Virtueller Zugriff auf Dateien

  Alt Gestern, 12: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.054 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Virtueller Zugriff auf Dateien

  Alt Gestern, 15: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.054 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Virtueller Zugriff auf Dateien

  Alt Gestern, 21: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
freimatz

Registriert seit: 20. Mai 2010
1.446 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Virtueller Zugriff auf Dateien

  Alt Heute, 08:57
Dnake für alle Rückmeldungen.

@Kas Ob.: Ja, das ist preislich schon eine andere Liga ... Davon abgesehen habe ich es nicht ganz so verstanden was die anbieten. Es macht für mich den Eindruck als da tatsächlich ein virtuelles Dateisystem in Windows zum Einsatz kommt. Ich möchte dagegen nur die Delphi-Datei-Methoden virtuell haben.

@Redeemer: ich vermute mal, dass Du mich nicht richtig verstanden hast. In deinem Code finde ich nirgendwo ein FileExists.
Eine function TZipFileWrapper.FileExists(const AFilename: string): Boolean; zu machen scheint mir nicht gerade schwer zu sein. Mir geht es hier in dem Thread nicht darum wie man auf konkret Dateien, Iso oder Zip zugreift sondern wie man diese drei unter einen Hut bekommt, so dass man Dateioperationen in existierendem Code allenfalls marginal ändern muss.
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
353 Beiträge
 
#8

AW: Virtueller Zugriff auf Dateien

  Alt Heute, 10:40
@Kas Ob.: Ja, das ist preislich schon eine andere Liga ... Davon abgesehen habe ich es nicht ganz so verstanden was die anbieten. Es macht für mich den Eindruck als da tatsächlich ein virtuelles Dateisystem in Windows zum Einsatz kommt. Ich möchte dagegen nur die Delphi-Datei-Methoden virtuell haben.
Hi,

Well, most likely i don't understand your need 100%, though i got the idea that you looking for some sort of solid file storage, or at least the interface or layer for such thing solution, back when it was Eldos, these 4 libraries were more than 4 and smaller, and per their designs they fit together also they had brilliant layered design so at every stage you can derive your own work and replace the default, anyways, if you are looking for the virtual or the solid file storage, then :

1) if you look at https://www.callback.com/cbfsvault then you will see that you can build and use the virtual/solidfile , they called it CBFS Vault layer, yet again this file(/system) could be mounted on every system as the library comes with many OS drivers to do so, or leave it for your own applications (example, called users in the diagram), again it is multi layered library,
to make it clearer with example, if you are familiar with TrueCrypt/VeraCrypt then you can have your own natively Pascal/Delphi built with few lines of code, and again this doesn't mean you are limited to their solid file storage standard as you can provide the files as you see fit from zip or generate them on the fly, these are just a scratch of what this library can do, and i hope it did clear some.

2) I remember seeing and testing few libraries in torry.net years ago, well can't find much now, but have a look at https://github.com/gabr42/GpDelphiUn...redStorage.pas it could be your needed interface, yet i already have fixed data structure to be used with its own, so it is solid file storage only for storing ordinary files (not virtualized), but non the less it is great and will provide you with idea(s).
Kas
  Mit Zitat antworten Zitat
Redeemer

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

AW: Virtueller Zugriff auf Dateien

  Alt Heute, 11:02
@Redeemer: ich vermute mal, dass Du mich nicht richtig verstanden hast. In deinem Code finde ich nirgendwo ein FileExists.
Nein, weil ich gedacht habe, eine einzige Zeile hinzuzufügen, wäre drin. Diese Zeile lautet:
Dictionary.Add(LocalHeader.FileName, Stream.Position);
Deine gewünschte Funktion ist dann TDictionary<string, Int64>.ContainsKey.
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 19:55 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