AGB  ·  Datenschutz  ·  Impressum  







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

64-Bit für TextFile / File of xxx

Ein Thema von himitsu · begonnen am 21. Okt 2005 · letzter Beitrag vom 12. Jan 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

64-Bit für TextFile / File of xxx

  Alt 21. Okt 2005, 16:40
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:
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;
Das ganze hat bisher aber noch einen kleinen Haken, denn ich habe diese Funktionen noch nicht getestet, als wenn sich jemand öpfern möchte ...

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

[edit=Sharky]Auf bitte von himitsu habe ich den Anhang aus diesem Posting entfernt. Mfg, Sharky[/edit]
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: 64-Bit für TextFile / File of xxx

  Alt 23. Okt 2005, 00:37
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.


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:
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);
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.


Zusätzlich kann Seek64 jetzt auch bei Textdateien (TextFile) verwendet werden, da dieses jetzt aufpasst, daß der Schreib-/Lesepuffer ordnungsgemäß geleert wird.
Dank: Object-Pascal / Delphi-Language -> TextFile Zeile suchen
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]
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: 64-Bit für TextFile / File of xxx

  Alt 18. Nov 2005, 02:22
Kleiner Fehler in Seek64 behoben.
(fehlende Prüfung beim Aufruf der Flush-Funktion)
Angehängte Dateien
Dateityp: pas file64_121.pas (9,2 KB, 50x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
dose

Registriert seit: 12. Jul 2006
11 Beiträge
 
#4

Re: 64-Bit für TextFile / File of xxx

  Alt 15. Jul 2006, 10:25
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: 64-Bit für TextFile / File of xxx

  Alt 15. Jul 2006, 12:15
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

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.
> standard error output in D4/5?



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
(ab/in D7 ungepatcht und in D4/D5 sollte es jetzt auch gehen)
Angehängte Dateien
Dateityp: pas file64_266.pas (11,7 KB, 25x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
dose

Registriert seit: 12. Jul 2006
11 Beiträge
 
#6

Re: 64-Bit für TextFile / File of xxx

  Alt 15. Jul 2006, 16:10
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:
begin
AssignFile(F, Filename);
Reset(F);
 while not Eof(F) do
  begin
   ReadLN(F,text);
   ShowMessage(IntToStr(FilePos64(F)));
  end;
CloseFile(F);
end;
Viele Grüße
(die olle) dose
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: 64-Bit für TextFile / File of xxx

  Alt 15. Jul 2006, 16:46
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:
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 Einlesen ist demnach bei allen DateiTypen mit Puffer der Zeiger weiter hinten, da mehr eingelesen wurde.

Beim Schreiben wird erst gespeichert, wenn Puffer voll ist, demnach ist dort der Zeiger meist etwas weiter vorne anzufinden.
$2B or not $2B
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#8

AW: 64-Bit für TextFile / File of xxx

  Alt 12. Jan 2011, 01:59
irgendwas ist hier noch faul
vielleicht ein benutzerfehler von mir oder ein bug....

Delphi-Quellcode:

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;
ist jetzt nicht der ÜBER-code, sollte aber nur zum testen sein
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...

Geändert von stho (12. Jan 2011 um 02:01 Uhr)
  Mit Zitat antworten Zitat
stho

Registriert seit: 16. Sep 2009
Ort: 127.0.0.1
288 Beiträge
 
Delphi 2007 Professional
 
#9

AW: 64-Bit für TextFile / File of xxx

  Alt 12. Jan 2011, 02:01
DOPPELPOST:
Sorry aber ich hab vergessen den Screenshot an zu hängen
Miniaturansicht angehängter Grafiken
fehler.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: 64-Bit für TextFile / File of xxx

  Alt 12. Jan 2011, 09:34
Zitat:
Sorry aber ich hab vergesse
Dafür gibt es notfalls einen [edit]-Button

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 Delphi-Referenz durchsuchenAnsiChar auf Delphi-Referenz durchsuchenWideChar umändert ... war ja schließlich niemals ein veränderliches Delphi-Referenz durchsuchenChar


Hier also eine Version, welche auch die kranken Änderungen in Delphi 2009+ beachtet:
Angehängte Dateien
Dateityp: pas File64.pas (11,2 KB, 24x aufgerufen)
$2B or not $2B
  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 21:13 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