Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:06
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Dez 2011 um 10:16 Uhr)
  Mit Zitat antworten Zitat