Autor Beitrag
Markus_Nr59
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 01.03.07 16:37 
Hallo Zusammen,

ich habe eine Logfile Komponente geschrieben und um diese
zu Testen ein kleines Testprogramm (TP) gleich mit.
Das TP erzeugt in definierbaren Zeitabständen Logmeldungen.

Die Komponente schickt das ganze dann an ein Log.txt.
Ist die Log.txt nicht forhanden wird dieses dann erzeugt.
Das funktioniert nur dann, wenn das TP neu gestartet wird.
Wird das Log.txt File während des loggens des TP gelöscht,
merkt die Komponente nix davon und schreibt fleißig weiter
in diese Datei, obwohl sie ja nicht mehr ist.

In stark verkürzter Form sieht das öffnen der Log.txt so aus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
try
    H:= FileOpen('Log.txt', fmOpenReadWrite)
except
    FActive := False;
end;


Das Handle H ist immer mit einer Adresse gefüllt. Der Exept-Block
wird nicht angesprochen.

Kann mir einer Helfen?

Vielen Dank im voraus
Markus

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Do 01.03.07 17:03 
Zitat Delphi Hilfe :

Zitat:
Use FileOpen to open a file and obtain a file handle. The access mode value is constructed by or-ing one of the fmOpen constants with one of the fmShare constants defined in File open mode constants. If the return value is 0 or greater, the function was successful and the value is the file handle of the opened file. A return value of -1 indicates that an error occurred.


Also Try..except wegmachen und dafür testen, ob deine variable H nicht zufällig -1 ist.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Markus_Nr59 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 01.03.07 17:22 
Hallo Helge,

daran habe ich auch schon gedacht, hat aber nicht's gebracht. H ist mit einem Wert >= 0 gefüllt. Geanuer gesagt mit dem gleichen Wert mit dem das Handle gefüllt ist wenn die Log.txt noch existent ist.

Noch jemand eine Idee?

Danke
Markus
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Do 01.03.07 17:39 
Das Handle ändert sich nicht, wenn die datei anschließend extern gelöscht wird. Dein Try/Except Block wird nur ausgeführt, wenn die Datei nicht erstellt werden konnte - insofern korrekt.
Du musst sicherstellen, dass die datei entweder nicht gelöscht werden kann (Parameter für FIleopen)
oder du öffnest Die datei beim Loggen und schließt sie dann wieder
grez
MSCH

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Do 01.03.07 19:18 
FileOpen war mir noch nie ganz geheuer. Ich mache sowas wenn, dann über das gute alte AssignFile usw.

Übrigens kann ich bei mir eine Datei die mit
ausblenden Delphi-Quelltext
1:
h:=FileOpen('c:\temp\test1h.txt',fmOpenReadWrite);					

geöffnet ist, nicht unter Windows löschen.

Zudem passiert folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
begin
     h:=FileOpen('c:\temp\test1h.txt',fmOpenReadWrite);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
   FileClose(h);
end;


Ich kann die Datei mit Button1 öffnen und mit Button2 wieder schließen.

Öffne ich sie aber und versuche sie anschließend zu löschen, kommt Windows mit der Ablehnung (wie oben schon gesagt). So weit so gut. Aber wenn ich sie dann mit Button2 schließen will, krieg ich eine Exception.

Wie gesagt - das Zusammenspiel zwischen Windows und dessen Dateihandles in Delphi habe ich nie so wirklich verstanden.
Markus_Nr59 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 02.03.07 13:51 
Hallo Zusammen,

Die Log-Komponente ist so geschrieben, das das Handle nach dem Schreiben wieder freigegeben wird. Beim löschen unter Windows war dies wohl gerade der Fall. Wenn man beim Debuggen unter Delphi gerade in dem Bereich des Codings rumschwirrt wo das Handle geholt ist, kann ich auch nicht unter Windows löschen. Habe ich allerdings vor euren Antworten nicht drauf geachtet.

Leider habe ich keine Parameter gefunden der verhindert das das File nicht gelöscht werden kann. Meine Lösung sieht so aus:
Durch die Funktionen "FileRead" und "FileWrite" wird das File bearbeitet. Beide Funktionen liefern eine -1 wenn sie Fehlgeschlagen sind. Darauf kann man dann reagieren.


Danke, ihr habt mir sehr geholfen
Markus
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Fr 02.03.07 15:33 
Ein File kann nicht geklöscht werden, wenn es das Attribut "ReadOnly" hat. Das geht mit der
Methode setFileattr o.s.Ä

_________________
Brain: an apparatus with which we think we think.