Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wo soll das FileMode im Quellcode hin? (https://www.delphipraxis.net/201230-wo-soll-das-filemode-im-quellcode-hin.html)

ter 3. Jul 2019 13:50

Wo soll das FileMode im Quellcode hin?
 
Frage:
Wo soll das FileMode im Quellcode hin?
Was ist richtig, 1) oder 2) oder 3)?
Code:

var TR : TextFile;
    s : string;
begin
...
1)
AssignFile(TR, 'D:\Dir\FileName.txt');
FileMode:=fmOpenRead;
Reset(T);
...
2)
FileMode:=fmOpenRead;
AssignFile(TR, 'D:\Dir\FileName.txt');
Reset(T);
...
3)
AssignFile(TR, 'D:\Dir\FileName.txt');
Reset(T);
FileMode:=fmOpenRead;
...
{-}
ReadLN(TR, s);
{-}
CloseFile(TR);
{-}
...
Gruss Terence

hoika 3. Jul 2019 13:53

AW: Wo soll das FileMode im Quellcode hin?
 
Hallo,
1 oder 2, vor dem Open.
Den alten Wert würde ich retten und nach der Operation wiederherstellen.

Amateurprofi 3. Jul 2019 14:30

AW: Wo soll das FileMode im Quellcode hin?
 
Ich vermute mit "FileMode" ist nicht das "Mode" im Record TR, sondern eine Variable die Du, aus welchen Gründen auch immer, irgendwo anders führst.
Dieses vorausgesetzt würde ich nach dem Reset(TR) (oder Rewrite(TR) oder Append(TR) oder CloseFile(TR))
Delphi-Quellcode:
FileMode:=TTextRec(TR).Mode;
machen.
Das stellt sicher, dass FileMode den Wert hat, der tatsächlich vom System gesetzt wurde.

DeddyH 3. Jul 2019 14:42

AW: Wo soll das FileMode im Quellcode hin?
 
Ich finde, das ist im Wiki ganz gut erklärt: http://docwiki.embarcadero.com/Libra...ystem.FileMode

TurboMagic 3. Jul 2019 19:04

AW: Wo soll das FileMode im Quellcode hin?
 
Frage an den original Poster: warum benutzt du diese klassischen Datei Routinen?
Es gibt inzwischen diverse modernere Alternativen, z. B.

- TFileStream
- TStringList.LoadFromFile

EWeiss 3. Jul 2019 20:58

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von TurboMagic (Beitrag 1435941)
Frage an den original Poster: warum benutzt du diese klassischen Datei Routinen?
Es gibt inzwischen diverse modernere Alternativen, z. B.

- TFileStream
- TStringList.LoadFromFile

Veraltet ist relativ kommt immer darauf an in welchem Kontext man es verwendet.
Nur weil es neuer\moderner ist muss es nicht immer den Bedürfnissen entsprechend besser sein.

Denn irgendwo setzt auch TStringlist auf irgendwelche Methoden auf nicht das es sogar letztendlich aufs gleiche rauskommt nämlich mit zugriff auf die Win32Api.
Die wurde bestimmt nicht für die TStringList neu erfunden.

gruss

hoika 3. Jul 2019 22:03

AW: Wo soll das FileMode im Quellcode hin?
 
Hallo,
FileMode hat mit WinAPI nicht direkt zu tun.

Aber ja:
Ich denke TStringList benutzt intern auch FileMode.

Luckie 3. Jul 2019 22:48

AW: Wo soll das FileMode im Quellcode hin?
 
Hat es mit Sicherheit. Es steuert ja, wie die Datei zu öffnen ist und reicht es an die API Funktion CreateFile weiter.

samso 4. Jul 2019 13:51

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von hoika (Beitrag 1435953)
Hallo,
FileMode hat mit WinAPI nicht direkt zu tun.

Aber ja:
Ich denke TStringList benutzt intern auch FileMode.

Nein, TStringList wertet die Variable FileMode nicht aus. Der FileMode wird ausschließlich von den "klassischen" Datei-Routinen benutzt. TStringlist benutzt dagegen (File-)Streams. Filestream setzen wiederum auf den File-Routinen des jeweiligen OS auf.

ter 5. Jul 2019 16:04

AW: Wo soll das FileMode im Quellcode hin?
 
Danke fuer die vielen Antworten.

Aus meiner Delphi 6 Hilfe erfahre ich
ueber "FileMode" folgendes:

---
Indicates the access mode on typed and untyped files
opened by the Reset procedure.

Unit

System

Category

I/O routines

var FileMode: Byte = 2;

Description

The FileMode variable determines the access mode to
use when typed and untyped files (not text files)
are opened using the Reset procedure.

The default FileMode is 2 (Read/Write access).
Assigning another value to FileMode causes all
subsequent Resets to use that mode. The SysUtils
unit declares a number of file open mode constants
that can be assigned to the FileMode variable.

Note: Be sure to reset FileMode before calling
Reset with a read-only file. Even if you are only
reading from the file, the default FileMode value
(Read/Write access) will cause an attempt to open
a read-only file to fail.

Warning: FileMode is declared as a variable,
not as a threadvar. Therefore this variable is not
thread-safe.
---

Leider kann ich nirgendswo feststellen, an welcher
Position es zu stehen hat. Default ist immer
FileMode:=fmOpenReadWrite;
gesetzt.

Bei der Verwendung von Append(T), also dem Oeffnen
einer Textdatei, var T : TextFile;, steht Append(T)
nach dem Reset(T). Hier muss FileMode:=fmOpenWrite;
gesetzt werden.

Da ich in meinem Programm aber mehrere TextDateien
oeffne, muss ich den Wert im FileMode oefters aendern.

Gruss Terence

ter 5. Jul 2019 16:09

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von Amateurprofi (Beitrag 1435915)
Ich vermute mit "FileMode" ist nicht das "Mode" im Record TR, sondern eine Variable die Du, aus welchen Gründen auch immer, irgendwo anders führst.
Dieses vorausgesetzt würde ich nach dem Reset(TR) (oder Rewrite(TR) oder Append(TR) oder CloseFile(TR))
Delphi-Quellcode:
FileMode:=TTextRec(TR).Mode;
machen.
Das stellt sicher, dass FileMode den Wert hat, der tatsächlich vom System gesetzt wurde.

Tut mir leid, aber du liegst voellig falsch.
Ich habe weder FileMode selbst definiert noch hat
es etwas mit ".Mode" zu tun.

Danke fuer Deine Hilfe.
Gruss Terence

ter 5. Jul 2019 16:16

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von DeddyH (Beitrag 1435916)
Ich finde, das ist im Wiki ganz gut erklärt: http://docwiki.embarcadero.com/Libra...ystem.FileMode

Danke Dir DeddyH.
Dort steht auch nur das, was in meiner Delphi 6 Hilfe
drinsteht. Alle irgendwo in der Hilfe vorkommenden
Beispiel-Quellcodes ueber Reset(T),..., etc. lassen
das FileMode nicht auftauchen, bzw. sind nicht in den
Beispiel-Quellcodes dabei.

Gruss Terence

ter 5. Jul 2019 16:19

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von hoika (Beitrag 1435914)
Hallo,
1 oder 2, vor dem Open.
Den alten Wert würde ich retten und nach der Operation wiederherstellen.

Danke hoika,
das mit dem "Retten" werde ich in Zukunft immer tun.
Macht man ja beim

var wOldErrorMode : word;
begin
...
wOldErrorMode:=SetErrorMode(SEM_FAILCRITICALERRORS );
...
SetErrorMode(wOldErrorMode);
...
end;

ebenfalls.
Gruss Terence

hoika 5. Jul 2019 16:23

AW: Wo soll das FileMode im Quellcode hin?
 
Hallo,
korrekt. ;)

DeddyH 5. Jul 2019 17:48

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Hinweis: Setzen Sie FileMode unbedingt zurück, bevor Sie Reset für eine schreibgeschützte Datei aufrufen. Auch wenn die Datei nur gelesen werden soll, verursacht der Standardwert von FileMode (Schreib-/Lesezugriff), dass das Öffnen einer schreibgeschützten Datei fehlschlägt.
Das erscheint mir persönlich relativ eindeutig. Man muss FileMode also irgendwann vor dem Reset setzen, damit es nicht kracht, wenn man eine schreibgeschützte Datei lediglich lesen möchte.

p80286 5. Jul 2019 22:39

AW: Wo soll das FileMode im Quellcode hin?
 
Filemode muß vor Reset,Append oder Rewrite gesetzt sein/werden.

Gruß
K-H

DeddyH 6. Jul 2019 08:20

AW: Wo soll das FileMode im Quellcode hin?
 
Nur vor Reset. Vor einem Append oder Rewrite den FileMode auf ReadOnly zu setzen wäre ja kontraproduktiv.

peterbelow 6. Jul 2019 11:35

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von ter (Beitrag 1435913)
Frage:
Wo soll das FileMode im Quellcode hin?
Was ist richtig, 1) oder 2) oder 3)?
Code:

var TR : TextFile;
    s : string;
begin
...
1)
AssignFile(TR, 'D:\Dir\FileName.txt');
FileMode:=fmOpenRead;
Reset(T);
...
2)
FileMode:=fmOpenRead;
AssignFile(TR, 'D:\Dir\FileName.txt');
Reset(T);
...
3)
AssignFile(TR, 'D:\Dir\FileName.txt');
Reset(T);
FileMode:=fmOpenRead;
...
{-}
ReadLN(TR, s);
{-}
CloseFile(TR);
{-}
...
Gruss Terence

Ist völlig egal, für Textfile wird Filemode intern durch Reset, Append oder Rewrite gesetzt. Das liegt daran, dass man Textfiles nicht für read und write öffnen kann, da der IO gepuffert wird. Filemode wird nur für file oder file of <type> verwendet, die nicht nur schreib/lesezugriff sondern auch random access erlauben.

ter 14. Jul 2019 11:54

AW: Wo soll das FileMode im Quellcode hin?
 
Ich habe jetzt die Loesung zu der FileMode Position.
Delphi-Quellcode:
    var S, D : File;
        ior : integer;
        myDPFNSource, myDPFNDest : string;
    ...
    myDPFNSource:='D:\File1.ext';
    myDPFNDest:='D:\File2.ext';
    ...
    AssignFile(S, myDPFNSource);
    FileMode:=fmOpenRead;
    {$I-} Reset(S, 1); //oeffnen
    {$I+} inc(ior, IORESULT);
    {-}
    AssignFile(D, myDPFNDest);
    FileMode:=fmOpenReadWrite;
    {$I-} Rewrite(D, 1); //ueberschreiben bzw. erzeugen
    {$I+} inc(ior, IORESULT);
    ...
Bei einer anderen Position mit verschieden gesetzten Dateiattributen ergeben sich Werte groesser Null in der IORESULT Rueckgabe.

Gruss
Terence

ter 14. Jul 2019 11:57

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von peterbelow (Beitrag 1436156)
Ist völlig egal, für Textfile wird Filemode intern durch Reset, Append oder Rewrite gesetzt. Das liegt daran, dass man Textfiles nicht für read und write öffnen kann, da der IO gepuffert wird. Filemode wird nur für file oder file of <type> verwendet, die nicht nur schreib/lesezugriff sondern auch random access erlauben.

Das wusste ich gar nicht. Vielen Dank fuer Deine Hilfe.
Gruss
Terence

p80286 14. Jul 2019 12:05

AW: Wo soll das FileMode im Quellcode hin?
 
Zitat:

Zitat von DeddyH (Beitrag 1436141)
Nur vor Reset. Vor einem Append oder Rewrite den FileMode auf ReadOnly zu setzen wäre ja kontraproduktiv.

Eben drum, Filemode könnte auf ReadOnly stehen!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 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