2012-03-27 10 views
7

Estoy tratando de registrar las acciones realizadas por un servicio que escribí utilizando el lenguaje C de Windows-API &, así que hice un sistema de archivos de registro.CreateFile siempre reemplaza el archivo especificado

El problema es que en cada llamada a CreateFile, el archivo se reemplaza en lugar de abrirlo y escribir al final del archivo.

Aquí está el código de mi función WriteInLogfile:

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); 
    } 
} 

¿Conoce a alguien en donde el tema viene de?

Gracias;)

+0

Por cierto, puede simplificar este código usando 'OPEN_ALWAYS', que dice' CreateFile' para abrir el archivo si existe o para crear el archivo si no lo hace. Entonces no tendrás que duplicar tanto tu código. –

Respuesta

6

Aunque está abriendo el archivo existente, no está especificando que desea agregarlo. Por lo tanto, se abre como una escritura genérica y termina sobrescribiendo los contenidos. Debe pasar el indicador FILE_APPEND_DATA al método CreateFile. Esto se hace mejor mediante el uso de la bandera FILE_GENERIC_WRITE que incluye 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

Esto funciona bien. ¿Sabes si hay una manera de mantener nuevas líneas con esto? Parece que se salta el mío ... –

+0

@tsabz no se deben cambiar las nuevas líneas si usa esta bandera. ¿Estás teniendo problemas para escribirlos? Es posible que deba agregarlos manualmente ya que 'WriteFile' no los agregará por usted. – JaredPar

+0

Hago mi llamada a la función de esta manera: 'WriteInLogFile (" LOG: somethingtowrite \ n ");' y no mantiene la nueva línea. –

1

Deberá ajustar el puntero del archivo al final del archivo antes de escribir con SetFilePointer. Consulte MSDN example.

1

No pude ver nada obvio sobre la apertura de Anexar en la documentación de CreateFile, pero podría usar la función SetFilePointer para buscar hasta el final del archivo antes de escribir.

2

Al abrir un archivo, el puntero siempre se posicionará al principio del archivo. Para agregar, debe buscar explícitamente hasta el final (SetFilePointer(hFile, 0, 0, FILE_END);).

Aunque puede no estar causando su problema real, reemplazaría su lógica actual tratando de usar CreateFile con OPEN_EXSTING, luego con CREATE_NEW si falla el primer intento. En su lugar, simplemente pase el indicador OPEN_ALWAYS, que prácticamente automatiza esa lógica: abra un archivo existente si existe y cree uno nuevo si no lo hace.

+0

Gracias, mezclé tu respuesta con la de JaredPar y todo va mejor ahora :) –

Cuestiones relacionadas