AGB  ·  Datenschutz  ·  Impressum  







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

Was genau maches Dateibefehle?

Ein Thema von iphi · begonnen am 3. Dez 2011 · letzter Beitrag vom 3. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 09:30
Hallo,

ich möchte gerne genau verstehen, was die folgenden Dateibefehle machen:

1.
Delphi-Quellcode:
...
var
  F: Textfile;
...
AssignFile(F,'myfile.txt');
Hier wird der Variablen F irgendetwas zugewiesen, korrekt?
Wird hier dynamisch Speicher zugewiesen, der zu einem Memoryleck führen könnte, wenn das Programm nach diesem Befehl beendet wird?
Die Datei selbst wird hier noch nicht geöffnet, korrekt?
Noch könnten andere Programme in die Datei schreiben, korrekt?

2.
ReWrite(F); Hier wird die Datei für Schreibzugriff geöffnet, korrekt?
Ab jetzt ist die Datei für andere Programme schreibgeschützt, korrekt?
Darf man rewrite mehrfach hintereinander ausführen?

3.
CloseFile(F); Hier wird die Datei geschlossen und wieder freigegeben, richtig?
Passiert hier irgendwas mit der Variablen F?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.203 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
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#3

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:18
Danke für die Info!

Wie komme ich denn an system.pas? Bei meinem Delphi6 Personal sind nur die DCUs dabei.

Noch eine Frage zu Blockwrite:

Bei ReWrite(F,size) kann ich die Einheitsgröße des zu schreibenden Datenblocks über size einstellen.
Kann ich die Blockgröße unterwegs ändern ohne den Dateizeiger wieder auf den Dateianfang zu setzen, d.h. gibt es sowas wie Append(F,size) ?
Bin in der Hilfe nicht fündig geworden.
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:22
Hi,

die Personal-Versionen erlauben leider keinen Zugriff auf den Source.
Der ist jeweils erst ab der Pro-Version dabei.


LG, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:31
Wie komme ich denn an system.pas? Bei meinem Delphi6 Personal sind nur die DCUs dabei.
Indem man sich eine Professional oder höher kauft.

Die Size sollte kann (?) man nur bei einem "typelosen" var f: File; verwenden.
Bei var f: File of XYZ; wird automatisch SizeOf(XYZ) verwendet.

Blockwrite schreibt keine "Bytes" sondern "Count", also eine Mehrzahl an ganzen Blöcken, so wie es in der OH auch geschrieben steht.
geschrieben Bytes = Count * RecSize (RecSize z.b. siehe Parameter des Rewrite oder siehe File-Typ)

Du kannst also ein typloses File erstellen (RecSize = 1), bzw. ein File of Byte und dann über BlockWrite quasi die Bytes/Blockgröße angeben.
Ich würde hier aber eher zu einem Delphi-Referenz durchsuchenTFileStream raten.

PS: BlockWrite, Seek und Co. gibt es für Textdateien (TextFile) nicht.
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:39 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:33
BTW, himitsu, mit welchen Befehl kann man nochmal den Puffer vergrößern, hab’s vergessen ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 10:43
BTW, himitsu, mit welchen Befehl kann man nochmal den Puffer vergrößern, hab’s vergessen ?
Das hatte ich "im" Quellcode mit erwähnt. BufPtr
Aber nur bei Textdateien ... die anderen haben keinen Puffer (abgesehn von der WindowsFileCache)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 11:22
Okay, hab’s gefunden, die dazugehörige Procedure heißt SetTextBuf. Wo kommt eigentlich der Alias AssignFile her, in meiner System.pas steht nur _Assign?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 11:29
Compilermagic ... du wirst dort auch kein Delphi-Referenz durchsuchenLength drin finden, sondern stattdessen z.b. soein komisches _LStrLen.

Die sind im Compiler verbaut und stehen quasi nur als Dummy in der System.pas drin.
Oder der Compiler baut entsprechende Umleitungen zur eigentlichen Funktion auf, inkl. eventueller Parameterkonvertierungen. (es gibt z.B. auch kein WriteLn mit mehreren Parametern)

Die System und SysInit darfst du also nicht immer wort-wörtlich interpretieren.
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 11:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#10

AW: Was genau maches Dateibefehle?

  Alt 3. Dez 2011, 12:20
Nutzt man diese Dinosaurier eigentlich noch?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:20 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