Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

TFileStream Probleme

5 views
Skip to first unread message

Stefan Koschke

unread,
Apr 11, 2008, 3:36:22 AM4/11/08
to
Hallo,

im 500 ms Takt versuche ich an eine Datei etwas anzuhängen:

fs := TFileStream.Create(filename, fmOpenWrite);
...
fs.position := fs.size;
fs.Write(PChar(s)^, Length(s));
fs.Free;
...

Das geht 10 Minuten lang gut und dann kommt beim Create des Filestreams eine
Fehlermeldung, daß die Datei nicht geöffnet werden konnte und fs ist Nil !
Wie bekomme ich das Problem in den Griff?
Wieso überhaupt kommt da eine Meldung? Ich bin bisher davon ausgegangen daß
spätestens nach fs.Free die Datei fertig und geschlossen ist?!
Nun sieht es aber so aus als ob diese Funktion bei einem weiteren Aufruf auf
die noch gar nicht fertige Datei zugreifen will?

Kann mir bitte jemand etwas Erleuchtung bringen ;-)

Ciao
Stefan


Dirk Reichstein

unread,
Apr 11, 2008, 4:45:33 AM4/11/08
to
wie gross ist denn die zu öffnende Datei?
Vielleicht schafft dein Controller es nicht in den 500ms sie zu öffnen und
einzulesen?

Gruss Dirk

Matthias Hanft

unread,
Apr 11, 2008, 4:55:41 AM4/11/08
to
Stefan Koschke schrieb:

>
> Nun sieht es aber so aus als ob diese Funktion bei einem weiteren Aufruf auf
> die noch gar nicht fertige Datei zugreifen will?

Da wird Windows halt im Hintergrund noch gar fertigschreiben... verhindern
kann man das vermutlich, wenn man am "Arbeitsplatz" mit der rechten Maus-
taste die "Eigenschaften" des Laufwerks anzeigt, dort auf "Hardware" geht,
die betreffende Platte auswählt, den Button "Eigenschaften" anklickt und
dann im Tab "Richtlinien" den Haken bei "Schreibcache auf dem Datenträger
aktivieren" wegmacht.

Wie schnell der Rechner dann generell noch funktioniert, sei dahingestellt :-)

Gruß Matthias.

Marian Aldenhövel

unread,
Apr 11, 2008, 5:01:51 AM4/11/08
to
Hallo,

> fs := TFileStream.Create(filename, fmOpenWrite);
> ...
> fs.position := fs.size;
> fs.Write(PChar(s)^, Length(s));
> fs.Free;
> ...

Reflex-Reaktion: Es fehlt das try..finally.

Gibt es einen Grund weshalb Du die Datei alle 500ms öffnest und schließt
und nicht einfach offen lässt?

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn
http://www.marian-aldenhoevel.de
"Success is the happy feeling you get between the time you
do something and the time you tell a woman what you did."

Stefan Koschke

unread,
Apr 11, 2008, 6:05:26 AM4/11/08
to
Hallo Dirk,
"Dirk Reichstein" <thelev...@freenet.de> schrieb im Newsbeitrag
news:668mp7F...@mid.individual.net...

> wie gross ist denn die zu öffnende Datei?
> Vielleicht schafft dein Controller es nicht in den 500ms sie zu öffnen und
> einzulesen?
>

das kann eigentlich nicht sein, da ein neuer Timerevent erst freigegeben
wird wenn die Schreibroutine abgeschlossen ist.

Ciao
Stefan


Stefan Koschke

unread,
Apr 11, 2008, 6:07:53 AM4/11/08
to
Hallo Matthias,

"Matthias Hanft" <m...@hanft.de> schrieb im Newsbeitrag
news:47FF278...@hanft.de...

die Datei ist bis 600 kB groß.
Den Schreibcache wollte ich eigentlich nicht abschalten.
Ich war davon ausgegangen, daß zwar ein Schreibcache existitert aber ein
kurz nach dem Schreiben erfolgender Lesezugriff dann halt die Daten aus
diesem Cache bekommt?!

Ciao
Stefan


Stefan Koschke

unread,
Apr 11, 2008, 6:10:13 AM4/11/08
to
Hallo Marian,

"Marian Aldenhövel" <mar...@mba-software.de> schrieb im Newsbeitrag
news:ftn9dn$ia5$1...@newsreader2.netcologne.de...

>Reflex-Reaktion: Es fehlt das try..finally.

>Gibt es einen Grund weshalb Du die Datei alle 500ms öffnest und schließt
>und nicht einfach offen lässt?

try..
baue ich sofort ein ;-)
a, einen Grund gibt es : die Datei ist eine Art Logbuch, welches alle 500ms
(oder auch alle 2 sec) aktualisiert werden soll solange das Programm läuft.
Während dieser zeit wollte ich aber auch die Möglichkeit haben sie mal mit
dem Editor ansehen zu können.
Wenn sie geöffnet ist wird das nicht gehen?

Ciao
Stefan


Andrej Kluge

unread,
Apr 11, 2008, 7:13:52 AM4/11/08
to
Stefan Koschke wrote:
> a, einen Grund gibt es : die Datei ist eine Art Logbuch, welches alle
> 500ms (oder auch alle 2 sec) aktualisiert werden soll solange das
> Programm läuft. Während dieser zeit wollte ich aber auch die
> Möglichkeit haben sie mal mit dem Editor ansehen zu können.
> Wenn sie geöffnet ist wird das nicht gehen?

Schonmal mit fsShareDenyWrite probiert?

Ciao
A.

Alfred Gemsa

unread,
Apr 11, 2008, 8:58:25 AM4/11/08
to
Stefan Koschke schrieb:

> a, einen Grund gibt es : die Datei ist eine Art Logbuch, welches alle 500ms
> (oder auch alle 2 sec) aktualisiert werden soll solange das Programm läuft.
> Während dieser zeit wollte ich aber auch die Möglichkeit haben sie mal mit
> dem Editor ansehen zu können.
> Wenn sie geöffnet ist wird das nicht gehen?

Doch, das geht. Ich schreibe dauernd in ein Logfile mit

writeln(OutFile,TextToWrite);

und schließe es nicht. Mit einem Editor kann ich den aktuellen Stand
sehen (kleine Verzögerungen wegen gepuffertem I/O (Windows) sind möglich).

Gruß, Alfred

Matthias Hanft

unread,
Apr 11, 2008, 10:52:43 AM4/11/08
to
Stefan Koschke schrieb:

>
> Ich war davon ausgegangen, daß zwar ein Schreibcache existitert aber ein
> kurz nach dem Schreiben erfolgender Lesezugriff dann halt die Daten aus
> diesem Cache bekommt?!

Hm, theoretisch ja - war ja auch nur eine Vermutung. Wenn Du den Cache
mal temporär abschaltest, und es geht dann, weißt Du wenigstens, daß es
daran liegt :-)

Vielleicht findest Du ja auch eine "Flush"- statt "Close"-Funktion, die
auch bei offengehaltener Datei alles rausschreibt.

Gruß Matthias.

Hans-Peter Diettrich

unread,
Apr 11, 2008, 11:25:14 AM4/11/08
to
Alfred Gemsa wrote:

Daß Du das kannst, mag an der unterschiedlichen Implementierung von TEXT
und TFileStream liegen. AFAIR schreibt Windows die Länge einer Datei nur
dann raus, wenn die Datei geschlossen wird. Ohne Close müßte der
Verzeichniseintrag auf Null Bytes stehenbleiben. Zumindest ließe sich
dieses Verhalten einfach nachprüfen...

DoDi

Hans-Peter Diettrich

unread,
Apr 11, 2008, 11:38:32 AM4/11/08
to
Stefan Koschke wrote:

> im 500 ms Takt versuche ich an eine Datei etwas anzuhängen:
>
> fs := TFileStream.Create(filename, fmOpenWrite);

> ....


> fs.position := fs.size;
> fs.Write(PChar(s)^, Length(s));
> fs.Free;

> ....


>
> Das geht 10 Minuten lang gut und dann kommt beim Create des Filestreams eine
> Fehlermeldung, daß die Datei nicht geöffnet werden konnte und fs ist Nil !
> Wie bekomme ich das Problem in den Griff?

Das Lesen und Schreiben der Datei darf nicht exklusiv erfolgen. Beim
Schreiben (oben) fehlt der ShareMode: fmShareDenyWrite. Und eventuell
solltest Du sogar fmOpenReadWrite verwenden, da sonst (lt. OH) die Datei
jedesmal komplett ersetzt und nicht verlängert wird. Entsprechend beim
Lesen, sofern Du darauf überhaupt Einfluß hast - ggf. ein anderes Tool
verwenden, das die zu lesende Datei nicht gegen andere Zugriffe blockiert.

> Wieso überhaupt kommt da eine Meldung? Ich bin bisher davon ausgegangen daß
> spätestens nach fs.Free die Datei fertig und geschlossen ist?!
> Nun sieht es aber so aus als ob diese Funktion bei einem weiteren Aufruf auf
> die noch gar nicht fertige Datei zugreifen will?

Dann mache fs zu einer globalen Variablen, dann kannst Du vor Create
nachprüfen, ob die Datei noch offen ist - das könnte zumindest helfen,
Fehlern in Deinem Code auf die Schliche zu kommen.

DoDi

0 new messages