Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Texdatei öffen (https://www.delphipraxis.net/46545-texdatei-oeffen.html)

carknue 26. Mai 2005 23:54


Texdatei öffen
 
Hallo,

ich möchte eine vorhandene Textdatei nur zum lesen öffen, gleichzeitig soll aber ein anderes Programm in die Datei schreiben dürfen. Wie ich es jetzt mache, funktioniert es nicht, weil das andere Programm nicht in die Datei schreiben kann.


Delphi-Quellcode:
OpenDialog1.Filter := 'DRM Log Files|*.log;*.txt;*.bak|All Files|*.*';
 if not OpenDialog1.Execute then
 Exit;
 Filemode:= fmOpenRead or fmShareCompat;
 
 {$I-}
 AssignFile(f, OpenDialog1.FileName);
 Reset(f);
 {$I+}
Was mache ich falsch?

mr47 27. Mai 2005 00:07

Re: Texdatei öffen
 
Tag :hi:

Erstmal: Garnicht :mrgreen:

-> Du kannst eine Datei nicht mit zwei Programmen gleichzeitig bearbeiten.
Frage: Wozu soll dass den gut sein? Bei sowas kommt meistens (Un)Kraut hinten raus. Du könntest evt. eine Art "Buffer" dazwischen schieben. Jedes Programm bearbeitet die Datei(ohne direkt in die Datei zu schreiben!) und am schluss wird gespeichert...

mfg

edit(2):

[ot]
Delphi-Quellcode:
{$I-} 
{$I+}
vofür sind diese Befehele?

[/ot]

Luckie 27. Mai 2005 00:14

Re: Texdatei öffen
 
Zitat:

Zitat von mr47
[ot]
Delphi-Quellcode:
{$I-} 
{$I+}
vofür sind diese Befehele?

Das sind Kompilerschalter und die findest du alle in der Hilfe.

carknue 27. Mai 2005 00:17

Re: Texdatei öffen
 
Es sollen ja nicht beide Programme reinschreiben. Also nochmal: Ich will nur lesen. Das andere Programm soll aber reinschreiben dürfen, währen die Datei von meinem Programm geöffnet ist. Was das andere Programm dann neu reinschreibt, interessiert mich nicht. Das Problem ist nur, dass mein Programm die Datei als Erstes öffnet.

Pr0g 27. Mai 2005 00:59

Re: Texdatei öffen
 
Warum liest du die Datei nicht ein und schließt sie danach wieder, bspw. mit einer StringList, oder einem FileStream?

MfG Pr0g

carknue 27. Mai 2005 10:08

Re: Texdatei öffen
 
Ich könnte auch ne kopie erstellen und die dann auslesen, möchte ich aber nicht, da dies zu lange dauern würde. Die text Datei kann schonmal 5-10Mb groß werden.

Also nochmal mein Problem: Filemode scheint nicht für Textdateien zu gelten. Wie öffne ich eine Textdatei readonly und das sie von anderen gleichzeitig beschrieben werden kann? Ich hätte gedacht, dass das ganz einfach mit Filemode geht.

marabu 27. Mai 2005 11:40

Re: Texdatei öffen
 
Hallo carknue,

fmShareCompat wird heute nur noch in den seltensten Fällen gebraucht (compatible bezieht sich auf DOS und SHARE.EXE). Mach es besser so:

Delphi-Quellcode:
var
  fTExt: TextFile;

begin
  AssignFile(fText, '');
  TTextRec(fText).Mode := fmOpenRead or fmShareDenyNone;
  TTextRec(fText).Mode := fmOpenWrite or fmShareDenyWrite;
  Reset(fText);
  CloseFile(fText);
end.
Grüße vom marabu

carknue 27. Mai 2005 19:17

Re: Texdatei öffen
 
So kriege ich die Datei überhaupt nicht auf. Error 102 Datei wird schon benutzt?!? :gruebel:

mr47 27. Mai 2005 21:58

Re: Texdatei öffen
 
Hast du auch zwischen die > '' < den Dateinamen geschrieben? :wink:

mfg

carknue 27. Mai 2005 22:13

Re: Texdatei öffen
 
Ja klar. Die error Abfang routine spricht bei jedem Versuch die Datei zu öffen an, obwohl sie von keinem anderen Programm geöffnet ist. Code sieht so aus:
Delphi-Quellcode:
OpenDialog1.Filter := 'DRM Log Files|*.log;*.txt;*.bak|All Files|*.*';
 if not OpenDialog1.Execute then
 Exit;
 ListBox1.Clear;
 paint;
 //Filemode:= fmOpenRead or fmShareCompat;
 Button1.Enabled := False;
 Button3.Enabled := False;
 Button5.Enabled := False;
 {$I-}
 AssignFile(f, OpenDialog1.FileName);
 TTextRec(f).Mode := fmOpenRead or fmShareDenyNone;
 TTextRec(f).Mode := fmOpenWrite or fmShareDenyWrite;
 Reset(f);
 {$I+}
 if IOResult = 0 then FileIsThere := true
 else FileIsThere := false;
 if FileIsThere then
 begin
.
.
.
IOResult ist <>0
Mit filemode läßt sich die Datei wenigstens öffnen... :gruebel:

BrunoT 27. Mai 2005 22:26

Re: Texdatei öffen
 
Hallo carknue,

eventuell geht das mit einer untypisierten Datei und Blockread/Blockwrite. so hatte ich zu sehligen DOS-Zeiten DBase-Dateien gelesen und geschrieben.

mfg

BrunoT

marabu 27. Mai 2005 22:47

Re: Texdatei öffen
 
Ich habe den Fehler 102 nachvollzogen und daraufhin mein Gedächtnis anhand meiner Unterlagen aufgefrischt. Ich habe TTextRec.Mode in meinem Beitrag weiter oben völlig falsch interpretiert. Diese Variable dient lediglich der Aufnahme der magic codes, mit denen Assign, Reset, Append und Rewrite der Open-Funktion des Textfile-Gerätetreibers ihre speziellen Wünsche signalisieren.

Für die korrekte Verwendung der share modi muss (und kann auch) ein eigener Gerätetreiber implementiert werden. Borland hat das Vorgehen hierzu in den Turbo Pascal Handbüchern der DOS-Versionen beschrieben, wenn ich mich recht erinnere. TextFile stellt letzten Endes eine Art Objekt dar, mit einigen Objektvariablen (Buffer, BufferSize, etc) und vier Methoden (Open, Close, Flush, InOut). Die Implementierung erfolgt aber nicht mit OOP-Sprachmitteln.

In der Dokumentation von Delphi 7, die mir vorliegt, rät Borland generell von der Verwendung von Dateivariablen ab und verweist auf FileStreams als Mittel der Wahl. Es würde mich nicht überraschen, wenn eine der neueren Versionen diesen Ballast aus DOS-Zeiten über Bord geworfen hätte.

Übrigens ist auch meine Aussage zu fmShareCompat nicht ganz korrekt gewesen. Der Kompatibilitätsmodus wurde zu Zeiten von DOS 3 benötigt, um FCB-basierte Dateioperationen aufrecht zu erhalten, wie sie unter DOS 1.1 und DOS 2.1 üblich waren.

Grüße vom marabu

Garfield 28. Mai 2005 08:15

Re: Texdatei öffen
 
Man kann die Datei auch 'als Kopie' öffnen. Heißt, von der Datei wird eine temporäre Kopie angelegt, welche dann geöffnet werden kann. Nach dem Schließen wird sie gelöscht.

Ich kann es jetzt gerade nicht prüfen, aber wenn man eine Textdatei in ein Memo lädt, kann man sie anderweitig bearbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz