Ich mach's mir Mal einfach ... schau doch selber nach ...
Grobe Zusammenfassung der Befehle/Typen:
Delphi-Quellcode:
const
{ File mode magic numbers }
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
{ Text file flags }
tfCRLF = $1;
// Dos compatibility flag, for CR+LF line breaks and EOF checks
type
{ Typed-file record }
{ Text file record structure used for Text files }
TTextBuf =
array[0..127]
of AnsiChar;
TTextRec =
packed record (* must match the size the compiler generates: 720 bytes *)
Handle: Integer;
// FileHandle, wenn Datei geöffnet
Mode: Word;
// fmClosed..fmInOut
Flags: Word;
// Set of (tfCRLF, ...)
BufSize: Cardinal;
// = SizeOf(Self.Buffer)
BufPos: Cardinal;
BufEnd: Cardinal;
BufPtr: PAnsiChar;
// = @Self.Buffer[0] oder SetTextBuf
OpenFunc: Pointer;
// OpenFile (Reset+Rewrite+Append)
InOutFunc: Pointer;
// Write/WriteLn/Read/ReadLn - Schreib/-Lesefunktion, je nach Self.Mode (Reset/Rewrite/Append)
FlushFunc: Pointer;
// Flush
CloseFunc: Pointer;
// CloseFile
UserData:
array[1..32]
of Byte;
// nicht verwendet
Name:
array[0..259]
of Char;
// dateiname
Buffer: TTextBuf;
// Lese-/Schreibpuffer
end;
function AssignFile(
var t: TTextRec;
const FileName: PChar): Integer;
var
Len: Integer;
begin
FillChar(t, SizeOf(TFileRec), 0);
t.BufPtr := @t.Buffer;
t.Mode := fmClosed;
t.Flags := tfCRLF * Byte(DefaultTextLineBreakStyle);
t.BufSize := SizeOf(t.Buffer);
t.OpenFunc := @TextOpen;
t.
Name := FileName;
end;
function OpenText(
var t: TTextRec; Mode: Word): Integer;
begin
if t.Mode <> fmClosed
then CloseFile(t);
...
end;
function Reset(
var t: TTextRec): Integer;
begin
Result := OpenText(t, fmInput);
end;
function Rewrite(
var t: TTextRec): Integer;
begin
Result := OpenText(t, fmOutput);
end;
function Append(
var t: TTextRec): Integer;
begin
Result := OpenText(t, fmInOut);
end;
function CloseFile(
var t: TTextRec): Integer;
begin
Flush;
t.Mode := fmClosed;
Result := CloseHandle(t.Handle);
end;
AssignFile initialisiert den Record und setzt den Dateinamen
Reset/Rewrite/Append öffnen die Datei
1. Standardmäßig kann kein Speicherleck entstehen, außer man ruft AssignFile auf eine geöffnete Dateivariable auf.
Denn AssignFile kann den Status einer Datei-Variable nicht prüfen, vorallem wenn sie auch noch nicht initialisiert sein könnte.
Das Dateihandle bliebe dann geöffnet.
PS: Wird in
WinNT und Nachfahren ein Programm beendet, würde Windows den Arbeitsspeicher (weitgehenst) aufräumen und Dateihandles schließen, selbst wenn noch was offen wäre.
Tipp: Selber ausprobieren? Datei öffnen ... fremdes Programm kann nicht lesen ... eigenes Programm abschießen (Taskmanager) oder Programm beenden und Datei dabei nicht schließen ... kann fremdes Program jetzt lesen?
2. Wie wäre es mal mit selber ausprobieren?
Nein, eigentlich nicht ... mehrere aufeinanderfolgene Offnenbefehle werden aber "ignoroert" (if open then exit).
3. Siehe Code.
PS:
TextFile = TTextRec (auch wenn man es so nicht gleich erkennt, aber man könnte es einfach mal casten)
File of ... = TFileRec
TFileRec = TTextRec ohne .Buffer und ohne .BufSize bis .BufPtr