![]() |
Darf man "File of <Record>" noch benutzen?
Nicht, dass es verboten wäre.
Ich habe ein paar alte Benutzerdaten die mit einem älteren Delphi-Programm geschrieben wurden und möchte die einlesen. In die Datei wurden ohne Kopf direkt viele, viele Records gleichen Typs geschrieben. Ich lese es momentan so ein:
Delphi-Quellcode:
Alles richtig soweit? Kann man das in 64-Bit-Zeiten, NTFS mit Rechteverwaltung noch machen? Ich habe von Dateizugriffen von der Platte mit Delphi nicht viel Ahnung, einen provisorischen Logger habe ich mit einer TStreamWriter/TFileStream-Kombo gelöst, aber direkt den Record so auslesen zu können war auch sehr komfortabel...
[...]
var inputFile: File of someRecord; returnedData: someRecord; [...] begin [...] try AssignFile(inputFile, absoluteFileName); [...] try Reset(inputFile); while not Eof(inputFile) do begin Read(inputFile, returnedData); [...] end; except // Ich habe keine Ahnung, was AssignFile, Reset und Read für konkrete // Exceptions werfen könnten... on Exception do [...] end; finally CloseFile(inputFile); end; [...] end; |
AW: Darf man "File of <Record>" noch benutzen?
Es funktioniert ja und ist einfach. Du könntest das natürlich durch TWriter / TReader ersetzen. Unangenehm sind nur die globalen Variablen die das steuern und damit nicht threadsafe sind.
|
AW: Darf man "File of <Record>" noch benutzen?
Hallo,
ich arbeite sehr gerne mit Records, weil mann da wirklich alles zu einem Datensatz bündeln kann was man benötigt. Dazu gehört natürlich auch das einfache Abspeichern in einer Datei und das schnelle und unkomplizierte Abrufen eines bestimmten Records. Ich habe das gelöst, in dem ich mir selbst ein Objekt TFile = class(TObject) geschrieben habe, das alles macht, was man im Umgang mit Dateien braucht. Die Funktionen kapseln sinnvoll die Windows-Api´s Davon leite ich ein neues Objekt für Records ab TRecFile = class(TFile) private FRL : Integer; {Recordlänge} public constructor CreateFil(FileName: PAnsiChar; Mode, Art, size : Word); function RecRead(var Buffer): DWORD; function RecWrite(const Buffer): DWORD; function RecSeekRead(var Buf; Pos : Integer ): DWORD; function RecSeekWrite(var Buf; Pos : Integer ): DWORD; ... Damit kann ich wirklich alles machen. Es geht sehr schnell, da die Api´s direkt aufgerufen werden und es werden nicht mehr Resourcen verbraucht als unbedingt notwendig. Das ist zwar nicht unbedingt im offiziellen Stiel - da kann man gar nicht genug Objekte erzeugen und wieder freigeben und Speicherplatz binden, aber es ist schnell und sicher. MfG Aro |
AW: Darf man "File of <Record>" noch benutzen?
Hallo,
in einem Netzwerk bzw. ohne Schreibrechte kannst Du Probleme bekommen, da reset ein file of record auch zum Schreiben öffnet. Das habe ich selbst schon schmerzlich erlebt. Deshalb empfehle ich die Verwendung von filemode:
Delphi-Quellcode:
Beste Grüße
assignfile(Datei,Name);
filemode:=0; reset(Datei); ... closefile(Datei); filemode:=2; Mathematiker |
AW: Darf man "File of <Record>" noch benutzen?
Kleine Anmerkung, ich arbeite mit einem buffer der x*sizeof(rec) ist, da läuft dann immer ein Lesezeiger mit. Ist etwas schneller als jeden record einzeln zu lesen.
Schreiben habe ich allerdings (noch) nicht implementiert. @Der schöne Günther Was Du suchst ist IORESULT. Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
|
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Also in der profesionellen Softwareentwicklung darf man eigentlich "File of <Record>" nicht mehr benützen und ich möchte das auch begründen.
1.) der Datei fehlt jeglicher Hinweis auf die enthaltene Datenstruktur Da aber Daten wichtiger sind als Programme ist dies ein Problem. Nach "Word 97" kräht heute kein Hahn mehr aber *.doc Dateien die mit dieser Version erzeugt wurden können immer noch wichtig sein. 2.) fehlende Interoparatibilität mit Fremdsoftware. CVS oder XML-Formate können auch mit anderer Software ausgewertet werden; ein "file of <Record>" ist ein totes Gleis 3.) fehlende Robustheit gegen Programierfehler und Wechsel der Programmiersprache Sollte der Programmierer bei der Definition des Record ein Fehler gemacht haben oder soll die Software in andere Progsprachen portiert werden kann es zu Verschiebungen kommen. Änderungen mit dem Editor sind gefährlich und können die Struktur zerstören. Im Worstcase kann die ganze Datei zum Datensalat werden. Oder man Importiert eine Datei mit 40000 Datensätzen in die Datenbank und stellt dann fest, dass alle Felder um ein Zeichen verschoben sind. Dann ist guter Rat teuer - wie bekommt man die defekten Datensätze wieder aus der Datenbank heraus? 4.) fehlende Erweiterbarkeit Soll ein Feld vergrössert werden, dann gibt es Schwierigkeiten. Die Software muss die alte und die neue Struktur beherrschen und ausserdem muss sie wissen ob eine best. Datei die alte oder schon die neue Struktur hat 5.) hoher Dokumentations- und Kommunikationsaufwand Bei einer CSV-Datei muss man nur die Reihenfolge der Felder und dessen Bedeutung kennen. Beim "file of <Record>" muss jedes Detail fehlerfrei geklärt sein. Für jedes Feld Position & Länge, Datentyp und bei Strings die Info ob links- oder rechtsbündig. Mit CR/LF als Recordtrenner oder ohne Recordtrenner, welcher Zeichensatz? 6.) keine Info welcher Zeichensatz benützt werden soll (CSV und XML können dagegen einen ![]() Die Vorteile der einfachen Implementierung und des fehlenden Overheads in der Datei können die Nachteile nicht ausgleichen. Ich und meine Kollegen haben lange Zeit mit "file of <Record>" Dateien gearbeitet. Wenn uns heute so eine Datei über den Weg läuft wird geflucht, nach der Doku gesucht (manchmal gibt es keine) und der Taschenrechner wird zum wichtigsten Hilfsmittel. |
AW: Darf man "File of <Record>" noch benutzen?
Ich wüsste wirklich nicht, wieso irgendjemand noch die alten Pascal-Routinen verwenden wollen würde, wo es Streams gibt... Ich fand das Arbeiten mit Streams schon immer viel angenehmer und intuitiver. Streams haben außerdem den Vorteil, dass du von jeder Datenquelle einlesen kannst, also nicht nur von der Festplatte, sondern auch aus dem RAM (TMemoryStream) oder ganz woanders her, z.B. von einem Netzwerkstream.
Dein obiges Beispiel mit Streams 1:1 übersetzt:
Delphi-Quellcode:
Ist sogar eine Zeile kürzer.
[...]
var Stream: TStream; returnedData: TSomeRecord; [...] begin [...] try Stream := TFileStream.Create(absoluteFileName); [...] try // Hier unnötig: // Stream.Position := 0; while Stream.Read(returnedData, SizeOf(returnedData)) > 0 do begin [...] end; except // Exceptions gibt es bei Streams natürlich! Z.B.: on EReadError do [...] end; finally Stream.Free; end; [...] end; Sehr praktisch finde ich bei Streams, dass man das Schreiben der Datei über mehrere Klassen und Methoden verteilen kann. Man übergibt einfach den Stream als Parameter. So kann man z.B. sehr einfach baumartige Objekt-Strukturen abspeichern... und das Wiedereinlesen geht ganz genau so. Wenn man es einigermaßen schlau anstellt, kann man solche Binärdateien (im Gegensatz zu File of record, wo man an das "record-Raster" gebunden ist) auch erweiterbar gestalten, indem man z.B. vor jeden Datensatz eine Typen-ID und eine Länge schreibt. Bei ![]() |
AW: Darf man "File of <Record>" noch benutzen?
Vielen Dank für die neuen Antworten! :-)
Meine ursprüngliche Frage ging weniger um die Struktur, ob man neue Daten so speichern sollte - Ich wollte wissen, ob ich Legacy-Daten, die eben so als Flat File auf die Platte geschrieben wurden auch so wieder einlesen kann. Oder ob es etwas besseres gibt. Das hat NamenLozer ja jetzt bestens geklärt :thumb: Auch wenn ich heute menschenlesbare standarisierte Formate wie CSV oder XML einsetze wo es geht: Bei wirklich massenhaftem Datenaustausch der einigermaßen schnell über die Bühne gehen muss bin ich mir da nicht sicher. Mein Haus liefert bsp. neuerdings auch Systeme aus, die nur noch noch lokal eine SSD haben und Netzanbindung an eine externe DB ist nicht unbedingt gegeben. Über Jahre hinweg fallen da eine Menge Daten an die vorgehalten werden müssen. Da nehme ich es ehrlich gesagt auch gerne dankend an, wenn ich eine Zehnerpotenz Speicher sparen kann... |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Wie gesagt man muss Vor- und Nachteile gegen einander abwägen. Ein Format mit festen Records hat da einfach zu viele Nachteile. |
AW: Darf man "File of <Record>" noch benutzen?
"File of <Record>" ?
Wenn es wirklich auf große Datenmengen und Geschwindigkeit ankommt, sind "Memory Mapped Files" die bessere Lösung. |
AW: Darf man "File of <Record>" noch benutzen?
@sx2008
Für alle Projekte mit Zukunft kann ich Dir nur zustimmen. Zitat:
Zitat:
Allerdings habe ich es schon erlebt, das sowohl XML als auch CSV durch editoren und Excel massakriert wurden. Zitat:
Um Deine erste Aussage noch einmal aufzugreifen, wir betreiben hier "Datenverarbeitung" und da sollten wir Daten auch mit größtmöglicher Sorgfalt behandeln. Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Ein Kunde exportiert z.B. regelmässig seinen Kundenstamm in dieses fixed record format und importiert es dann mit einer anderen Software in eine Datenbank. Durch Änderungen in seiner IT ändert sich der Zeichensatz von ISO 8859-1 auf UTF-8. Er hat den Import zwar getestet, nur waren halt keine Umlaute in den Testdaten. Im Echtbetrieb sind aber Umlaute enthalten (UTF-8 Multibytezeichen) und schon verschiebt sich alles. Oder seine Daten stammen aus einem Unix-System und werden per FTP in die Windowswelt kopiert. Dabei wird auch der Zeilenumbruch von CR --> CR/LF umgewandelt. Aber einmal nicht aufgepasst (weil binary statt text-Mode verwendet) und alle Records sind um ein Zeichen zu kurz was "wunderhübsche" Datenverschiebungen zur Folge hat. In der Importsoftware haben wir dann eine Prüfung eingebaut:
Delphi-Quellcode:
Das gab aber auch wieder Ärger denn abundzu kam es vor, dass hinter dem letzten Record noch ein End-Of-File Zeichen klebte.
if FileSize mod RecordSize <> 0 then Fehler()
|
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Stopp... Doch Du hast in alles Punkten recht...Nicht weiter lesen... Wenn man eine Software programmiert, die Dateien bearbeitet, die ein User in irgend einer Form mit anderer Software auch bearbeiten können muss... Aber [OT] Ich will nicht, dass: 1. Meine Anwender auch nur die Möglichkeit haben die Dateien zu editieren. 2. Dritte in die Dateien reinschauen können. 3. Kompatibilität zu Vorgänger-Versionen herzustellen ist. 4. --- Punkt gestrichen --- Daher werden alle Daten-Dateien Verschlüsselt, mir jeweils anderer Reihenfolge pro Programmstart gespeichert, jeweils mit anderem Offset versehen, die Verschlüsselung ändert sich per Zufall usw. Querbeziehungen stellen eine Manipulation fest, redundante Speicherung verhindert Datenverlust. Und alles was mir in den letzten 31 Jahren noch so eingefallen ist. [/OT] Mavarik PS: Unnötig zu erwähnen, dass es nix schnelleres gibt als ein Blockread... Wenn die Datensatzlängen dann noch glatte Sektorgrößen/Binärlängen haben...Und der Lesepuffer so viele Daten aufnehmen kann wie die Festplatte in einer Umdrehung lesen kann.... PPS: Achja, dass waren noch Zeiten, als man den Floppy-Controller und die DMA noch per ASM angesprochen hat. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Zitat:
Wartbarkeit, Erweiterbarkeit, Robustheit sind die Schlagworte. Wenn das alles gewährleistet ist, kannst Du über Performance nachdenken. Oder wenn Du ein RDBMS schreibst, oder einen Datenlogger, von mir aus. Die gängigen und modernen Dateiformate und Bibliotheksfunktionen sind eh schnell genug und fast immer wartet die Anwendung auf den Anwender und nicht umgekehrt. Ich mache mir jedenfalls keine Gedanken mehr über Probleme, die vor 30 Jahren schon gelöst wurden. Zitat:
Wenn mir ein altes 'File-Of-Record' über den Weg läuft, welches ich lesen muss, dann drücke ich jedes Mal die Daumen, ob die Feldausrichtung der Recordelemente immer noch genau so ist, wie damals. Das Problem hat man ja -nebenbei bemerkt- nicht nur bei Dateien, sondern leider werden auch viele Daten so verschickt. Ich gehe mittlerweile so vor, das ich Element für Element einzeln aus dem Stream fische. So kann ich padding Bytes, Endianverknurpselungen oder sonstige exotische Dateitypen individuell abfangen. Wenn ich Objekte serialisiere (was einem File-Of-Record ähnlich ist), dann bekommen meine Objekte eine Versionsnummer. Die steht in jedem 'Record' als erstes. Anhand dieser Nummer kann ich dann entscheiden, wie ich vorgehe und welche Eigenschaften in welcher Reihenfolge gelesen werden. XML finde ich persönlich grauslich, aber nur, weil die Datei 'ein wenig' größer wird, als beabsichtigt. Ansonsten ist es idiotensicher und eignet sich auch zum Austausch mit Daten aus der inneren Mongolei. Hier ist JSON für mich geeigneter, weil es genauso idiotensicher ist, aber eben kompakter. Um die Frage des TE zu beantworten: Man darf, wenn man muss, aber man sollte nicht, wenn man die Wahl hat. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Einige der Hauptgründe für ein file of record sind doch wohl,
|
AW: Darf man "File of <Record>" noch benutzen?
Bekanntermaßen führen viele Wege nach Rom. Und die o.g. Anforderungen lassen sich mit typisierten Dateien prinzipiell natürlich erreichen. Auf die möglichen Probleme, die dieser Weg mit sich bringen kann, wurde ja schon völlig richtig hingewiesen. Wenn es wichtig sein sollte - warum auch immer - punktuell nur einzelne Bereiche einer Datei zu beschreiben, dann können typisierte Dateien wieder hoch im Kurs stehen.
Letztlich ist auch "File of Record" nur eines von mehreren Werkzeugen der Softwaretechnik und man wird in Abhängigkeit der Anforderungen seine Wahl treffen müssen. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Grundsätzlich hat ein Programm seine Arbeit so schnell es geht zu erledigen, und dabei immer nach dem alten Motto "First make it run, then make it fast" Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Zitat:
Mavarik |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Und natürlich hast Du 100%ig Recht! Mavarik |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Wir hatten allerdings sogar schon den Fall, daß ein Kunde auf die glorreiche Idee kam eine EXE im Hex-Editor zu bearbeiten, um irgendeinen String in einem Dialog zu ändern. Die Betriebserlaubnis für das Medizinprodukt ist natürlich erloschen, und eigentlich hat sich der Mensch strafbar gemacht...aber wir haben einfach mal den Servicevertrag gekündigt. Sherlock |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Zitat:
Zitat:
Ich hatte bisher erst einen Fall, bei dem die Daten geschützt sein mussten. Dann wird eben verschlüsselt. Aber nur, weil es sich um einen embedded PC handelte, ohne Netzanbindung und keinerlei DB-Treiber installiert werden durften. Ansonsten schütze ich Daten, indem sie auf das RDBMS kommen. Übrigens würde ich mich freuen, wenn irgendwer in Konfigurationsdaten rumfummelt. Das gibt nämlich dann eine saftige Rechnung! Ich kenne nur keinen Fall, wo ich File-of-record einem Stream vorziehen würde. Aber vermutlich, weil ich nicht mit Records arbeite, keine Shortstrings verwende, sowie keine einfachen Strukturen habe. Jedem das Seine, würde ich da sagen. |
AW: Darf man "File of <Record>" noch benutzen?
Irgendwie habe ich diesen Thread so verstanden, dass Daten von einem alten Delphi-Programm eingelesen werden sollen.
Im neuen Programm würde ich auch auf aktuelle Strukturen setzen (Datenbank, XML, etc. bzw. Klassen statt Records) aber den Zugriff auf diese alten Daten mit einem Adapter-Pattern und dem file of record (in einem Strategy-Pattern) realisieren. |
AW: Darf man "File of <Record>" noch benutzen?
Richtig, eigentlich wollte ich nur wissen, ob ich Legacy-Daten, die ebenso geschrieben wurden, auch wieder so einlesen kann. Ob das Konzept mit dem "File" heute Probleme bei Dingen wie Rechten, Netzwerkpfaden, Überschreitung von Dateigrößen oder Sonderzeichen mit sich bringt.
Aber ein bisschen weiterführende Diskussion schadet ja nicht :chat: |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Probleme in diesem Kontext sind mir dazu nicht bekannt. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Im Ernst: Ich bezweifle, das eine in Turbo-Pascal geschriebene Datei unter Delphi noch als File-Of-Record ausgelesen werden kann. Nicht das weiß, das es nicht geht, ich bin einfach nur unsicher. Daher würde ich das happenweise einlesen, einfach, um auf Nummer sicher zu gehen. Ich meine mich nämlich zu erinnern, das der 'packed record' nicht mehr ganz so gepackt ist, wie früher (oder war es das packed array?) |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Ansonsten gilt: Packed ist packed... sonst wäre das ja komplett sinnlos. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Bis D2006 gib's da keine Probleme.
Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
Doch, leider ja. Habe hier ein Beispiel, ist aber closed source: packed records mit packed arrays und short strings. 'packed array of boolean'. An einer Stelle muss mittlerweile ein zusätzliches Byte rein (zum Auffüllen).
Ergo: Ist meistens kompatibel, aber unterschreiben würde ich es nicht. Daher schreibe ich explizite Lese- und Schreibroutinen für Records. Wenn ich sie denn noch benutze. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Langer Diskussion kurzer Sinn "Es spricht nichts dagegen sie zu nutzen, wenn man weiß was man tut" Es gibt in der Zwischenzeit Formate, die nicht so fehleranfällig sind. Gruß K-H |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Wenn es funktioniert, ist es gut, für neue Projekte gibt es verlässlichere Lösungen. |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
Und schon bin ich kompatible zu TP |
AW: Darf man "File of <Record>" noch benutzen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 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