CreateFile всегда переопределяет указанный файл - PullRequest
7 голосов
/ 27 марта 2012

Я пытаюсь записать действия, выполненные службой, которую я написал, используя Windows-API и язык Си, поэтому я создал файловую систему журнала.

Проблема в том, что при каждом вызове CreateFile файл переопределяется, а не просто открывается и пишет в конце файла.

Вот код моей 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);
    }
}

Кто-нибудь знает, откуда возникла проблема?

Спасибо;)

Ответы [ 4 ]

6 голосов
/ 27 марта 2012

Даже если вы открываете существующий файл, вы не указываете, что хотите добавить к нему. Следовательно, он открывается как общая запись, и вы в конечном итоге перезаписываете содержимое. Вам необходимо передать флаг FILE_APPEND_DATA методу CreateFile. Лучше всего это сделать с помощью флага FILE_GENERIC_WRITE, который включает 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))
    {
2 голосов
/ 27 марта 2012

Когда вы открываете файл, указатель всегда будет располагаться в начале файла. Чтобы добавить, вам нужно явно искать до конца (SetFilePointer(hFile, 0, 0, FILE_END);).

Хотя это может и не вызывать вашей реальной проблемы, я бы заменил вашу текущую логику, пытаясь использовать CreateFile на OPEN_EXSTING, затем на CREATE_NEW, если первая попытка не удалась. Вместо этого просто передайте флаг OPEN_ALWAYS, который в значительной степени автоматизирует эту логику - откройте существующий файл, если он существует, и создайте новый, если его нет.

1 голос
/ 27 марта 2012

Я не видел ничего очевидного об открытии для Append в документации CreateFile, но вы могли бы использовать функцию SetFilePointer для поиска конца файла перед записью.

1 голос
/ 27 марта 2012

Вам нужно установить указатель файла в конец файла перед записью с помощью SetFilePointer .См. MSDN пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...