2012-03-27 9 views
7

Ich versuche, die Aktionen von einem Dienst protokolliert, die ich schrieb mit der Windows-API & C-Sprache, so dass ich ein Protokolldateisystem.CreateFile überschreibt immer die angegebene Datei

Das Problem besteht darin, dass bei jedem Aufruf von CreateFile die Datei überschrieben wird, anstatt sie nur zu öffnen und am Ende der Datei zu schreiben.

Hier ist der Code meiner WriteInLogfile Funktion:

void WriteInLogFile(LPCTSTR log_string) 
{ 
    HANDLE hFile; 
    DWORD dBytesWritten; 

    if ((hFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, 
          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE 
     && (GetLastError() == ERROR_FILE_NOT_FOUND)) 
    { 
     if ((hFile = CreateFile(LOG_FILE_PATH, GENERIC_WRITE, 0, NULL, 
           CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) 
     { 
      if (!WriteFile(hFile, log_string, strlen(log_string), &dBytesWritten, NULL)) 
       aff_error("WriteInLogFile"); 
      CloseHandle(hFile); 
     } 
    } 
    else 
    { 
     if (!WriteFile(hFile, log_string, strlen(log_string), &dBytesWritten, NULL)) 
      aff_error("WriteInLogFile"); 
     CloseHandle(hFile); 
    } 
} 

jemand wissen Sie, wo das Problem herkommt?

Dank;)

+0

Übrigens können Sie diesen Code vereinfachen, indem Sie 'OPEN_ALWAYS' verwenden, was' CreateFile' anweist, die Datei zu öffnen, falls sie existiert, oder die Datei zu erstellen, falls dies nicht der Fall ist. Dann müssen Sie nicht so viel von Ihrem Code duplizieren. –

Antwort

6

Obwohl Sie die vorhandene Datei öffnen, geben Sie nicht an, dass Sie sie anhängen möchten. Daher öffnet es sich als generisches Schreiben und Sie überschreiben den Inhalt. Sie müssen das FILE_APPEND_DATA-Flag an die CreateFile-Methode übergeben. Dies geschieht am besten durch die FILE_GENERIC_WRITE Flagge verwendet, die FILE_APPEND_DATA

if ((hFile = CreateFile(LOG_FILE_PATH, FILE_GENERIC_WRITE, 0, NULL, 
          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE 
     && (GetLastError() == ERROR_FILE_NOT_FOUND)) 
    { 
+0

Das funktioniert gut. Weißt du, ob es einen Weg gibt, neue Zeilen zu behalten? Es scheint, dass es meins überspringt ... –

+0

@tsabz neue Zeilen sollten nicht geändert werden, wenn Sie dieses Flag verwenden. Hast du Probleme, sie zu schreiben? Möglicherweise müssen Sie sie manuell hinzufügen, da 'WriteFile' selbst diese nicht für Sie hinzufügt. – JaredPar

+0

Ich mache meinen Aufruf an die Funktion wie folgt: 'WriteInLogFile (" LOG: somethingtowrite \ n ");' und es behält den Zeilenumbruch nicht. –

1

Sie müssen die Dateizeiger auf das Ende der Datei setzen, bevor mit SetFilePointer zu schreiben. Siehe MSDN example.

1

Ich konnte nichts offensichtliches über das Öffnen von Append in der CreateFile-Dokumentation sehen, aber Sie könnten die SetFilePointer Funktion verwenden, um das Ende der Datei vor dem Schreiben zu suchen.

2

enthält Wenn Sie eine Datei öffnen, wird der Zeiger immer auf den Anfang der Datei positioniert werden. Zum Anhängen müssen Sie explizit bis zum Ende suchen (SetFilePointer(hFile, 0, 0, FILE_END);).

Obwohl es möglicherweise nicht Ihr tatsächliches Problem verursacht, würde ich Ihre aktuelle Logik versuchen, CreateFile mit OPEN_EXSTING zu verwenden, dann mit CREATE_NEW, wenn der erste Versuch fehlschlägt. Übergeben Sie stattdessen einfach das OPEN_ALWAYS-Flag, das diese Logik ziemlich automatisiert - Öffnen Sie eine vorhandene Datei, falls vorhanden, und erstellen Sie eine neue Datei, falls dies nicht der Fall ist.

+0

Danke, ich mische deine Antwort mit JaredPar's und alles läuft jetzt besser :) –

Verwandte Themen