hilpers


  hilpers > comp.lang.* > comp.lang.delphi.misc > 08/2004

 #1  
20.08.2004, 22:27
Marc Setterich
Hallo,

ich habe ein Programm geschrieben, bei dem auf Dateien in einem
bestimmten Ordner zugegriffen wird, um zu verhindern, dass jemand
anderes mit dem Programm aus dem Netzwerk auf die Dateien in diesem
Ordner zugreift, wird eine Datei erstellt (Dump.txt).
Das Programm sucht nach dieser Datei und wird diese gefunden gibt es
eine Fehlermeldung, dass man nicht auf die Dateien zugreifen kann.
Bis dahin funktioniert auch alles, aber nach Beendigung des Zugriffs
auf diesen Ordner soll die Datei wieder gelöscht werden, was aber
nicht funktioniert.
Zum Erstellen der Datei benutze ich:

'if NOT FileExists(DumpFile) then FileCreate(DumpFile)'

Danach mache ich nichts weiter mit der Datei, ich greife nicht auf sie
zu, oder sonst irgendeine Aktion.
zum löschen benutze ich:

'if FileExists(DumpFile) then DeleteFile(DumpFile)'

aber es passiert gar nichts.
Wenn ich im Explorer versuche die Datei manuell zu löschen, bekomme
ich eine Fehlermeldung, die Datei wird anscheinend vom Programm
benutzt.
Weiß jemand woran das liegen könnte?

Danke im vorraus
 #2  
20.08.2004, 22:38
Ralf Mimoun
Moin!

Marc Setterich wrote:
....
> 'if NOT FileExists(DumpFile) then FileCreate(DumpFile)'
>
> Danach mache ich nichts weiter mit der Datei, ich greife nicht auf sie
> zu, oder sonst irgendeine Aktion.


Das denkst nur Du. Nicht Windows.

> zum löschen benutze ich:
>
> 'if FileExists(DumpFile) then DeleteFile(DumpFile)'
>
> aber es passiert gar nichts.
> Wenn ich im Explorer versuche die Datei manuell zu löschen, bekomme
> ich eine Fehlermeldung, die Datei wird anscheinend vom Programm
> benutzt.
> Weiß jemand woran das liegen könnte?


Jep: RTFM. FileCreate gibt Dir ein Integer als Handle zurück. Mit anderen
Worten: Du belegst die Datei. Den Rest findest Du in der Onlinehilfe.

Und es ist keine wirklich gute Idee, einfach eine Datei als Test zu nehmen.
Bessere Möglichkeit:

- Wenn Datei nicht existiert, Datei erstellen

- Datei so lange exklusiv öffnen, wie Du was sperren willst.

- Danach Datei nicht löschen

Wenn die Datei da ist und Du sie nicht öffnen kannst, ist grad eine andere
Instanz dran. Und wenn die aus irgendeinem Grund abschmiert, ist das Lock
wieder weg.

Bye, Ralf
 #3  
20.08.2004, 22:45
Wolfgang Fellger
Marc Setterich schrieb:

>'if NOT FileExists(DumpFile) then FileCreate(DumpFile)'


Autsch. Das Ding gibt ein Dateihandle zurück. Wenn du das gleich wieder
wegwirfst bleibt die Datei natürlich offen bis sich irgendjemand drum kümmert.
Wenn du Glück hast Windows beim Beenden des Programms.

>[...]
>zum löschen benutze ich:
>
>'if FileExists(DumpFile) then DeleteFile(DumpFile)'
>
>aber es passiert gar nichts.


Lies mal die Doku. Auch DeleteFile ist eine Funktion und gibt ein (zugegeben
wenig informatives) False zurück, wenn die Aktion gescheitert ist.

>Wenn ich im Explorer versuche die Datei manuell zu löschen, bekomme
>ich eine Fehlermeldung, die Datei wird anscheinend vom Programm
>benutzt.
>Weiß jemand woran das liegen könnte?


Du benutzt die Datei ja auch. Hättest du das von FileCreate zurückgegebene
Handle aufgehoben, könntest du die Datei mit FileClose wieder schließen.
Also etwa:

var MyHandle: THandle;
begin
MyHandle:=FileCreate(DumpFile);
if MyHandle=-1 then
raise Exception.Create('Fehler');
[...]
FileClose(MyHandle);
if not DeleteFile(DumpFile) then
raise Exception.Create('Fehler');
end;
 #4  
20.08.2004, 23:31
Thomas G. Liesner
Wolfgang Fellger schrieb:
> Lies mal die Doku. Auch DeleteFile ist eine Funktion und gibt ein (zugegeben
> wenig informatives) False zurück, wenn die Aktion gescheitert ist.


Somit: If Not FileDelete(...) then RaiseLastWin32/OSError;

So long,
Thomas G. Liesner
 #5  
21.08.2004, 03:53
Marian Aldenhövel
Hi,

> Zum Erstellen der Datei benutze ich:
>
> 'if NOT FileExists(DumpFile) then FileCreate(DumpFile)'


Und wenn zwischem dem Test und dem Create jemand anders die
Datei anlegt? "Jemand anders" ist ein anderer Thread desselben
Programms, ein anderes Programm auf derselben Maschine oder
ein Programm auf einer anderen Maschine im Netz.

Versuche auf Gut Glück zu erzeugen. Gelingt das, ist die Sperre
Dein. Gelingt es nicht, so wird eine Exception geworfen, und es war
jemand vor Dir da (oder es gibt ein anderes Problem).

> Danach mache ich nichts weiter mit der Datei, ich greife nicht
> auf sie zu


FileCreate() legt nicht einfach nur eine Datei an. Es öffnet sie
auch. Deshalb kannst Du sie nicht einfach löschen.

Deinen Beispielen entnehme ich, daß Du die Sperrdatei nur während
eines Deiner Programmläufe brauchst, und nicht noch nachdem Dein
Programm beendet ist. In diesem Fall verwende nicht die Existenz
der Datei als Kriterium sondern eben gerade die Schreibsperre, die
Du drauf hältst:

try
FLockFile=TFileStream.Create(LockFileName,fmCreate );
except
ShowMessage('Konnte Sperrdatei nicht anlegen?');
exit;
end;

try
// Aktion, die geschützt werden soll
finally
FLockFile.Free;
end;

Ein DeleteFile ist dabei nicht nötig, ja es kann sogar schädlich sein.

Erweiterungen betreffen die Logik des Anlegens der Sperre, Du könntest
mehrere Versuche in gewissen Abständen unternehmen, und Du könntest in
die Datei Zusatzinformation aufnehmen. Etwa wer wann die Sperre angelegt
hat. Diese Zusatzinformation kannst Du dann im Fehlerfall anzeigen.

Ciao, MM
 #6  
21.08.2004, 03:54
Marian Aldenhövel
Hallo,

> Wenn du Glück hast Windows beim Beenden des Programms.


Das ist garantiert.

Ciao, MM
Ähnliche Themen
Basis für My.FileSystem.DeleteFile

Hi, My.FileSystem bietet einige Methodenüberladungen, die die Windows-Shell-Spielereien mit den fliegenden Blättern nutzen (SHFileOperation in der API). Finden sich diese...

[W2K/XP] Registry: %WINDIR% funktioniert nicht, nur C:\WINNT\SYSTEM32 funktioniert?

Hi, da ich manchmal eine Applikation in niedriger Priorität ausführen muss, damit ich mit dem Rechner besser arbeiten kann, habe ich mir eine Explorererweiterung mittels...

Junk-Mail-Filter von Outlook funktioniert nicht. Habe nun einen vom Drittanbieter drauf! Funktioniert!

Hallo Zusammen Habe die Nase vom outlookeigenen Junk-Mail-Filter gestrichen voll! Der funktioniert von hinten bis vorne nicht! Der lässt alle Nachrichten durch! Ich hatte...

uses windows - deletefile will PAnsiChar, ohne windows - deletefile willstring

Hallo NG, nur mal zur Sicherheit gefragt: Ist das wirklich so, wie ich diesen Effekt heute beobachten konnte - benutzt man Unit Windows, dann funktioniert deletefile nur mit...

Business Connector: Services ´deleteFile´ und ´moveToFile´

Hallo, Hab ein Problem mit den Services ´writeToFile´ und ´deleteFile´. Wollte diese noch am Ende in meinen Flow einnbinden, um das verarbeitete EDI-File vom...


Alle Zeitangaben in WEZ. Es ist jetzt 17:40 Uhr. | Privacy Policy