![]() |
64-Bit für TextFile / File of xxx
An alle Wagemutigen.
Mir ist gestern abend was nettes beim Überarbeiten meiner Dateifunktionen aufgefallen und da hab ich gleich mal Delphi's Standardfunktionen zur Datei-Ein-/Ausgabe 64-Bit-tauglich gemacht. Es ist bestimmt schon aufgefallen, daß die netten Dateifunktionen eigentlich nur auf 32-Bit basieren, allerdings kann man unter bestimmten Voraussetzungen dennoch mit Dateien über 2GB arbeiten. Dieses trift vorallem zu, wenn man nicht mit dem Dateizeiger rumspielt, demnach kein Seek, FilePos und FileSize aufruft. Ebenso darf man die Datei nicht zum Datenanhängen öffnen, also nicht per Append öffen, da dort ja ebenfalls der Dateizeiger verändert wird. Wenn man aber dennoch nicht auf die oben erwähnten Funktionen verzichten will, so kann man einfach auf meine Versionen ausweichen. Diese sollten zu 100% zu Delphi's Dateifunktionen/Dateitypen kompatibel sein. Seek64, FilePos64 und FileSize64 können dabei ohne irgendeine Änderung verwendet werden. Nur vor der Verwendung von Append (zum öffnen einer Datei) muß statt mit AssignFile mit AssingnFile64 initialisiert werden, da AssingnFile64 die für Append nötigen Funktionen einrichtet.
Delphi-Quellcode:
Das ganze hat bisher aber noch einen kleinen Haken, denn ich habe diese Funktionen noch nicht getestet, als wenn sich jemand öpfern möchte ...
Unit File64;
// © 1997-2005 by FNS Enterprize's™ // © 2003-2005 by himitsu @ Delphi-PRAXiS // Removement for default file funktions: // ************************************** // // Use this funktions to enable the 64 bit support. // // AssignFile64 Implants the 64 bit version of TextOpen (it's an internal function). // Seek64 The 64 bit version of Seek. // FilePos64 The 64 bit version of FilePos. // FileSize64 The 64 bit version of FileSize. Interface Uses Windows; Function AssignFile64(Var F{: TextFile/File of xxx}; Const S: String): Integer; Procedure Seek64 (Var F{: File of xxx}; recNum: Int64); Function FilePos64 (Var F{: TextFile/File of xxx}): Int64; Function FileSize64 (Var F{: TextFile/File of xxx}): Int64; Rein theoretisch sollte aber alles funktionieren, nur in AssignFile64 kann es vorkommen, das sich da ein Fehler versteckt, da ich mir an einer Stelle nicht ganz sicher war ... werd mir das aber in den nächten Tagen auch selber nochmal genauer ansehen. Außerdem "mußte" ich einige Funktionen aus der System.pas rauskopieren, da ich bisher noch keinen Weg gefunden hatte an deren Pointer ranzukommen, ohne vorher mal eine Datei mit den Standardfunktionen (mindestens 2-mal) zu öffen. Ich meine damit die Funktionen, welche mit einem Unterstrich beginnen. > _Funktionsname So, wenn sich jetzt dennoch mal jemand an die kleinen Funktiönchen wagen will, so würde ich mich über viel Feedback freuen. Ach ja, nur um es nochmals erwähnt zu haben, alle anderen unktionen, zum Öffnen/Lesen/Schreiben/Schließen werden weiterhin wie gehabt verwendet. die Änderung betrifft nur die oben aufgeführent Funktionen. Das ganze hab ich jetzt auch noch in 'ner netten Unit untergebracht und wenn die Portierung aus'm UCC perfekt war, dann sollte das ganze ut funktionieren. Also wie gesagt, das ganze ist nur so aus'm Gedächtnich erstellt und getestet wurde auch noch nichts, aber ich weiß zumindestens, daß die Unit sich unter D7Pro kompilieren läßt :mrgreen: [edit=Sharky]Auf bitte von himitsu habe ich den Anhang aus diesem Posting entfernt. Mfg, Sharky[/edit] |
Re: 64-Bit für TextFile / File of xxx
So, ich hab doch tatsächlich 'ne richtige Vermutung gehabt ... es mußten noch 2 NOTs rein -.-''
Und weil ich schon mal dabei war, hab ich auch gleich noch ein bissl was optimiert/verändert (z.B. IFs > CASE). Außerdem hatte ich mir noch ein bissl Zeit zum Testen genomen und es scheint doch tatsächlich so zu funktionieren, wie ich es mir ausgedacht hab. :mrgreen: Wie gesagt, bei der Verwendung gibt es nicht besonderlich viel zu beachten (außer beim Append).
Code:
Var T: TextFile;
[color=red]AssignFile64[/color](T, [color=gray]Filename[/color]); [color=green]// wegen des Append's[/color] Append(T); Write(T, [color=gray]S[/color]); [color=gray]Position[/color] := [color=red]FilePos64[/color](T); CloseFile(T);
Code:
Var F: File of Byte;
AssignFile(F, [color=gray]Filename[/color]); Rewrite(F); [color=red]Seek64[/color](F, [color=gray]Position[/color]); Write(F, [color=gray]i[/color]); [color=gray]Position[/color] := [color=red]FilePos64[/color](F); CloseFile(F);
Code:
Also, jetzt müßt ihr, selbst bei den Standardfunktionen, nur noch auf die Größe des freien Festplattenspeichers achten ... nichts mehr mit maximal 2 GB. :angle:
Var F: File of Byte;
AssignFile(F, [color=gray]Filename[/color]); Reset(F); [color=red]Seek64[/color](F, [color=gray]Position[/color]); Read(F, [color=gray]i[/color]); [color=gray]Position[/color] := [color=red]FilePos64[/color](F); CloseFile(F); Zusätzlich kann Seek64 jetzt auch bei Textdateien (TextFile) verwendet werden, da dieses jetzt aufpasst, daß der Schreib-/Lesepuffer ordnungsgemäß geleert wird. Dank: ![]() Ich empfehle aber (falls nötig) danach zum Begin der nächsten Zeile zu gehen, da Seek ja unter Umständen mitten in 'ner Zeile landet.
Code:
Seek64(F, [color=gray]Position[/color]);
ReadLn; Und für alle, welche gern die Größe des Schreib-/Lesepuffers verändern existiert jetzt auch noch SetTextBufEx. Diese Prozedur achte natürlich ebenfalls auf den Schreib-/Lesepuffer - das originale SetTextBuf setz ja einfach diesen Puffer zurück, ohne den Inhalt ordnungsgemäß zu entsorgen. Außerdem benötigt diese Prozedur nur die gewünschte Puffergröße und die Angelegenheiten wie Speicher reservieren/freigeben wird intern von selbst erledigt. Zum Schluß natürlich noch die neue und vermutlich auch endgültige Version :) [edit=Sharky]Dateianhang entfernt. Die neue Version ist im nächsten Beitrag Mfg, Sharky[/edit] |
Re: 64-Bit für TextFile / File of xxx
Liste der Anhänge anzeigen (Anzahl: 1)
Kleiner Fehler in Seek64 behoben.
(fehlende Prüfung beim Aufruf der Flush-Funktion) |
Re: 64-Bit für TextFile / File of xxx
Hallo,
Bin begeistert über die Funktionien die deine Unit zur Verfügung stellt. Leider ließ sie sich bei mir unter Delphi 5 Pro nicht einbinden, beim complieren traten jede Menge fehler auf, z.B. Undefinierter Bezeichner TTextRec Then erwartet, aber Bezheichner BufferPos gefunden usw. Nach einbinden der uses SysUtils reduzierten sich die Fehler, aber es gibt immer noch jede Menge Fehler:: Undefinierter Bezeichner ErrOutput Undefinierter Bezeichner PufPtr Undefinierter Bezeichner Flags Undefinierter Bezeichner tfCRLF Undefinierter Bezeichner DefaultTextLineBreakStyle usw. Sorry für die plumpe Frage, aber: Was mach ich falsch? Ist die Unit nicht mit Delphi 5 kompatibel? Gibt es evtll. einfach alternativen sie kompatibel zu machen? Viele grüße dose |
Re: 64-Bit für TextFile / File of xxx
Liste der Anhänge anzeigen (Anzahl: 1)
Na ja, diese Unit ist aus 'nem D7 heraus entstanden ... ich werd mal sehn was ich da machen kann :)
[add] So, hab ja keine entsprechende Delphi-Proffessional-Plus-Version zur Hand ... konnte demnach also nicht nachsehn, ob, wieviel und was intern so anders ist ... hoffe also einfach mal, daß sich intern nicht so viel geändert hatte :stupid: Die Unit SysUtils wurde nicht eingebunden, obwohl in D4 und vermutlich D5 die Typen TFileRec und TTextRec darin definiert sind ... in D7 sind sie in der System-Unit zu finden. Allerdings ist vorallem TTextRec in D4 noch recht einfach gehalten ... es fehlen also einige Dinge (siehe Zeile 74 bis 83), wodurch also auf "selbstdefiniertes" gesetzt wird. In D4 und D5 mussen diese "eigenen" Typen eingebunden werden, dazu braucht einfach nur in Zeile 52 der Kommentar geschlossen zu werden ( "{" >> "{}" ) Es gibt zwar noch ein Problemchen, aber mal shn ob sich da 'ne Lösung anfindet. > ![]() Nun hoffe ich nur, daß es auch läuft ... hab nich so viel Zeit alles durchzutesten, aber wenn intern nichts geändert wurde, dann geht's schon :stupid: (ab/in D7 ungepatcht und in D4/D5 sollte es jetzt auch gehen) |
Re: 64-Bit für TextFile / File of xxx
Hi himitsu,
Vielen Dank, ich bin schwer beeindruckt. Der Code läuft unter meiner Delphi 5 Pro Version. Ich habe die Version übrigends jetzt auf einem Delphi 6 System auch laufen lassen klappt prima :-) Respekt... Eine Sache wundert mich: Die Postionsangaben in Seek64 / FilePos64 bezogen auf die ReadLN Funktion. Sowohl Delhi 5 als auch 6: Irgendwie können die Werte binär nicht stimmen, und wenn man den Wert als Zeilanangabe interpretiert passt es auch nicht. Ich hatte mal vermutet, dass ReadLN den Datenpositionszeiger überhaupt nicht anrührt und nach einem ReadLN mit Seek64 um vorhergehende Position plus Textlänge + CRLF "händisch" verschoben war aber auch nicht ganz gepasst. Ist dir die Angabe klar? z.B.
Delphi-Quellcode:
Viele Grüße
begin
AssignFile(F, Filename); Reset(F); while not Eof(F) do begin ReadLN(F,text); ShowMessage(IntToStr(FilePos64(F))); end; CloseFile(F); end; (die olle) dose |
Re: 64-Bit für TextFile / File of xxx
Der Positionszeiger ist der von der WinAPI.
Also über SetFilePointer/GetFilePointer. der Typ TEXT/TextFile hat intern einen Puffer, worein er erstmal einließt und daraus die Daten erst in den "String" schreibt (und beim schreiben natürlich andersrum). Dieses ist ja nötig, weil irgrends gespeichert ist wie lang der String ist, also
Delphi-Quellcode:
Beim Einlesen ist demnach bei allen DateiTypen mit Puffer der Zeiger weiter hinten, da mehr eingelesen wurde.
1:
einlesen in Puffer nachsehn wo das Datei-/Zeilenende ist Daten bis Endmarke, oder Pufferende in String kopieren wenn keine Endmarke gefunden, dann gehe zu 1 Beim Schreiben wird erst gespeichert, wenn Puffer voll ist, demnach ist dort der Zeiger meist etwas weiter vorne anzufinden. |
AW: 64-Bit für TextFile / File of xxx
irgendwas ist hier noch faul ;-)
vielleicht ein benutzerfehler von mir oder ein bug....
Delphi-Quellcode:
ist jetzt nicht der ÜBER-code, sollte aber nur zum testen sein ;-)procedure TForm1.FormCreate(Sender: TObject); Function GetString : String; begin result := 'Testtesttest...'; end; var tf : TextFile; sLine : String; aFile : STring; begin aFile := 'C:\moep.txt';; try AssignFile64 (tf, aFile); Append(tf); while true do begin sLine := GetString; WriteLn(tf, sLine); sleep(10); end; finally CloseFile(tf); end; end; wie erkennbar sollte das Prgramm in einer Dauerschleife "Testtesttest..." zeilenweise in eine Datei schreiben. nun, in der Datei kommt aber nur "@ý BE hAE dAE àAE C:\moep.txt " aus... |
AW: 64-Bit für TextFile / File of xxx
Liste der Anhänge anzeigen (Anzahl: 1)
DOPPELPOST:
Sorry aber ich hab vergessen den Screenshot an zu hängen :-( |
AW: 64-Bit für TextFile / File of xxx
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Joar, da gab es einen Unterschied im ReadFile/WriteFile-Aufruf. Ich hatte damals eine Interfaces mit einem Pointer-Parameter im Einsatz, wärend in Delphi aktuell nur eine Variante mit einem untypisiertem Var-Parameter existiert, welche natürlich einen dereferenzierten Pointer benötigt. Gut, dabei hab ich auch gleich mal die Datei etwas aufgeräumt und Fehler behoben. > Wer konnte den Ahnen, daß Codegear einfach mal so ein ![]() ![]() ![]() Hier also eine Version, welche auch die kranken Änderungen in Delphi 2009+ beachtet: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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 by Thomas Breitkreuz