Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TFileStream EFOpenError (https://www.delphipraxis.net/163619-tfilestream-efopenerror.html)

fuchsle 7. Okt 2011 08:42

TFileStream EFOpenError
 
Hallo,

mir ist aktuell folgendes Verhalten unklar.
Es wird die Existens der Datei geprüft (befindet sich auf einem Netzlaufwerk),
direkt danach wird die Datei mit einem Stream gelesen.

Wie kann es dabei zu der Fehlermeldung kommen, dass die Datei nicht gefunden werden konnte?

exception message : Datei "..." kann nicht geöffnet werden. Das System kann die angegebene Datei nicht finden.

Delphi-Quellcode:
// ...
      if FileExists(Filename) then
      begin
        Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyNone);
// ...

Bernhard Geyer 7. Okt 2011 08:53

AW: TFileStream EFOpenError
 
Evtl. Wildcards im Dateinamen vorhanden?
Dann wird eine Datei gefunden die diesem Wildcard entspricht, aber geöffnet kann sie natürlich nicht werden.

fuchsle 7. Okt 2011 09:21

AW: TFileStream EFOpenError
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1129020)
Evtl. Wildcards im Dateinamen vorhanden?
Dann wird eine Datei gefunden die diesem Wildcard entspricht, aber geöffnet kann sie natürlich nicht werden.

Entschuldigung, eine Information wäre sicher noch hilfreich.
Es handelt sich hier um eine Texdatei "*.log"
hier werden alle 60s die Werte neu rein geschrieben <-- Darauf habe ich keinen Einfluss und keine Einsicht
Demnach wird auch in meinem Programm die Datei alle 60s ausgelesen.
Die Fehlermeldung gibt es jedoch immer erst nach einigen Stunden im Testbetrieb.

Es gibt bei den Ausfällen keine erkennbaren Muster, wie eine bestimmte Uhrzeit oder Stundenzahl.
Taucht also eher sporatisch auf, bis es jedoch soweit ist, wurde die Datei sicher schon einige zehntausend mal ausgelesen.

Bernhard Geyer 7. Okt 2011 09:24

AW: TFileStream EFOpenError
 
Wenn sehr oft Datei geöffnet und geschrieben wird könnte es auch sein das ein Virenscanner querschießt und die Datei kurzzeitig im Beschlag hat. Evtl. mal Virenscanner für das Verzeichnis abschalten.

CCRDude 7. Okt 2011 09:31

AW: TFileStream EFOpenError
 
Auf eine Datei namens "*.log" wirst Du nur mit direkter Kommunikation auf NTAPI-Ebene zugreifen können (genauso wie halt lpt1, etc.).

Deswegen extra die Nachfrage von Bernhard Geyer, und ich vermute mal, Du meinst nicht *.log, sondern irgendwas.log mit anderem irgendwas.

Wird die Datei neu erstellt, wenn sie geschrieben wird, oder wird wirklich nur angehängt? Sonst gäbe es halt einen winzigen Augenblick, in dem sie tatsächlich nicht existiert.

Außerdem gibt es einen Bug in fmShareDenyNone, das denied nämlich das Löschen. Das FreePascal-Team habe ich dazu sofort zum fixen überredet bekommen, im QC steht es schon 4 Jahre. Wobei das nur umgekehrt dafür verantworlich sein könnte, daß keine neuen Werte geschrieben werden können, während Du ausliest, wenn diese per Löschen & Überschreiben geschrieben werden. Also potentielle Fehlerquelle, aber nicht für den beschriebenen Fehler.

Union 7. Okt 2011 09:34

AW: TFileStream EFOpenError
 
Greifen mehrere Instanzen auf dieselbe Datei zu? Findet vielleicht ein Umbenennen ab einer bestimmten Größe statt und Du rennst da genau zu dem Zeitpunkt rein?

fuchsle 7. Okt 2011 09:57

AW: TFileStream EFOpenError
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1129036)
Wenn sehr oft Datei geöffnet und geschrieben wird könnte es auch sein das ein Virenscanner querschießt und die Datei kurzzeitig im Beschlag hat. Evtl. mal Virenscanner für das Verzeichnis abschalten.

Ist auf einem Laufwerk im Firmennetz, habe keine Möglichkeit, Einfluss auf Scanner oder sonstiges zu nehmen.

Zitat:

Zitat von CCRDude (Beitrag 1129037)
Deswegen extra die Nachfrage von Bernhard Geyer, und ich vermute mal, Du meinst nicht *.log, sondern irgendwas.log mit anderem irgendwas.

Korrekt, ich meinte "irgendwas.log"

Zitat:

Zitat von CCRDude (Beitrag 1129037)
Wird die Datei neu erstellt, wenn sie geschrieben wird, oder wird wirklich nur angehängt? Sonst gäbe es halt einen winzigen Augenblick, in dem sie tatsächlich nicht existiert.

Wie die Datei beschrieben wird, habe ich aktuell nicht in Erfahrung bringen können.

Da es sich hier nicht wirklich um einen Log, sonder um einen Export von 4 Werten aus einer DB handelt, stehen nie mehr als 4 Werte in der Datei.
Dadurch könnte ich mir vorstellen, dass die Datei über löschen und schreiben aktualisiert wird.


Wie gesagt, ich habe und hatte keinen Einfluss auf die Exportfunktion, welche die Werte in die Datei überträgt.

fuchsle 7. Okt 2011 10:00

AW: TFileStream EFOpenError
 
Zitat:

Zitat von Union (Beitrag 1129039)
Greifen mehrere Instanzen auf dieselbe Datei zu? Findet vielleicht ein Umbenennen ab einer bestimmten Größe statt und Du rennst da genau zu dem Zeitpunkt rein?

Mehrere lesende instanzen greifen auf die Datei zu.
Zitat:

Zitat von fuchsle (Beitrag 1129053)
Da es sich hier nicht wirklich um einen Log, sonder um einen Export von 4 Werten aus einer DB handelt, stehen nie mehr als 4 Werte in der Datei.

Umbenennen findet nicht statt und Größe der Datei ändert sich nicht signifikant.

fuchsle 7. Okt 2011 10:12

AW: TFileStream EFOpenError
 
Zitat:

Zitat von CCRDude (Beitrag 1129037)
Wird die Datei neu erstellt, wenn sie geschrieben wird, oder wird wirklich nur angehängt? Sonst gäbe es halt einen winzigen Augenblick, in dem sie tatsächlich nicht existiert.

mir wurde folgendes zugetragen:
Zitat:

Die Datei wird neu geschrieben.
Als xx.log Datei.
Die bestehende Datei wird dann umbenannt in xx.L01 usw.
Date created: 31.08.2011 13:49
Date modified: 07.10.2011 11:13

Demnach wird die Datei doch nicht gelöscht?
Das "Date created" müsste doch mit dem "Date modified" übereinstimmen?

Union 7. Okt 2011 10:16

AW: TFileStream EFOpenError
 
Zitat:

Zitat von fuchsle (Beitrag 1129062)
Wenn ich jedoch direkt zuvor die Existens der Datei prüfe und es dennoch zu dem Fehler kommt, würde das für mich nun heißen, dass die Datei wärend ich Sie auslese gelöscht wird.

Das sollte man dann anders Programmieren, z.b. Zugriffsversuche in einer Schleife mit Exception.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 1 von 2  1 2      

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