|
|
||||||
|
#1
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|