Ausführen im VS->OK, auf Konsole->Fehler (CreateFile)
-
Hallo,
ich hab ein seltsames Problem. Ich schreibe in meinem Programm immer in eine Logdatei, die ich oft öffnen und schließen muss.
Wenn ich mein Programm im Visual Studio ausführe, funktioniert alles problemlos. Wenn ich die kompilierte EXE-Datei jedoch von der Konsole starte, scheint es vorerst auch gut zu funktionieren, aber immer an unterschiedlichen Stellen kommt dann eine IO Meldung beim Öffnen meiner Logdatei.
IO-Code 32
The process cannot access the file because it is being used by another process.
Mein Programm arbeitet streng sequentiell. Es gibt keine Threads oder so. Vor dem Öffnen der Logdatei wird auch überprüft, ob diese bereits durch mein Programm geöffnet ist, oder nicht. Aber normaler weise wird sie nach einem Logeintrag immer geschlossen und bei einem neuen wieder geöffnet.
Ich hab natürlich auch versucht als Release zu kompilieren, aber ohne Erfolg.
Hier die Zeile, die für das Öffnen zuständig ist:
CreateFile(path, FILE_READ_DATA, NULL, NULL, OPEN_ALWAYS, NULL, NULL)
Schließen:
CloseHandle(<hier das Filehandle>)
Ich weiß nicht so Recht, woran das liegen soll. Wie gesagt, wenn ich es im VS Studio durch den Debugger ausführe ist alles in Ordnung. Der gleiche Ablauf auf der Konsole bringt jedoch Fehler.
Vielleicht hat jemand eine Idee,
besten Dank.
-
Moin,
wo hast Du denn den zweiten Parameter "FILE_READ_DATA" her, den finde ich nicht bei CreateFile ?
Wie hast Du die Datei das erste mal geöffnet, mit GENERIC_READ, FILE_SHARE_READ ?
http://msdn.microsoft.com/en-us/library/aa363874(VS.85).aspxGruß
-
Hallo.
So, wie Du Dein Problem beschreibst, könnte es glatt sein, das der erste Schreibzugriff dem zweiten Schreibzugriff noch im Wege steht. Wenn Du die Datei ständig brauchst, mach sie doch zu Beginn des Programms auf und am Ende des Programms wieder zu. Oder synchronisiere die Zugriffe.
Gruß
Lars
-
C++Greenhorn schrieb:
wo hast Du denn den zweiten Parameter "FILE_READ_DATA" her, den finde ich nicht bei CreateFile ?
Das frag ich mich auch gerade. Ich hatte mich glaub ich an diversen Beispielen und Tutorials orientiert und dort wurde das immer genommen. Das Gegenstück dazu war "FILE_WRITE_DATA". Ich werd es mal auf GENERIC_READ bzw. GENERIC_WRITE umstellen. Mal schauen ob das hilft.
chezzmatazz schrieb:
Wenn Du die Datei ständig brauchst, mach sie doch zu Beginn des Programms auf und am Ende des Programms wieder zu. Oder synchronisiere die Zugriffe.
Ich hatte das umgesetzt, um abgeschlossene Transaktionen zu erreichen. Aber hab nun in der Hilfe gelesen, dass es auch ne Möglichkeit gibt, das File zu "flushen". Damit würde es wohl reichen die Datei 1x zu öffnen und 1x zu schließen. Ich probiers mal aus, danke für die Hinweise.
mfg
-
Ok, das Problem tritt irgendwie nicht mehr auf...also manchmal ist es echt seltsam.
Ich hab die Anwendung nun so umgestellt, dass das LogFile am Anfang 1x geöffnet wird (mit READ und WRITE) und am Ende 1x geschlossen. Dazwischen wird die Konsistenz hergestellt, indem immer wieder "FlushFileBuffers" aufgerufen wird. Jedoch hab ich nun das Problem, dass sich der ganze Ablauf wesentlich (und damit mein ich mehr als 10x soviel) verlängert hat.
Mit ständigen OPEN und CLOSE war das ganze sehr viel performanter. Gibt es eine besser Methode das File zu flushen, als mit FlushFileBuffers? Oder ist ein CloseHandle schon das schnellste?
Danke.