CreateFile始终覆盖指定的文件

我正在尝试记录我使用Windows-API和C语言编写的服务所做的操作,因此我创建了一个日志文件系统。

问题是,在每次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); } } 

有人知道问题的来源吗?

谢谢 ;)

即使您打开现有文件,也没有指定要附加到该文件。 因此它会作为通用写入打开,最终会覆盖内容。 您需要将FILE_APPEND_DATA标志传递给CreateFile方法。 最好通过使用包含FILE_GENERIC_WRITE标志来完成

 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)) { 

打开文件时,指针始终位于文件的开头。 要追加,您需要明确地寻找到最后( SetFilePointer(hFile, 0, 0, FILE_END); )。

虽然它可能不会导致您的实际问题,但我会替换您当前的逻辑尝试使用CreateFileOPEN_EXSTING ,然后使用CREATE_NEW如果第一次尝试失败。 相反,只需传递OPEN_ALWAYS标志,该标志几乎可以自动化该逻辑 – 如果存在则打开现有文件,如果不存在,则创建一个新文件。

在使用SetFilePointer写入之前,需要将文件指针设置为文件末尾。 请参阅MSDN 示例 。

我在CreateFile文档中看不到关于打开Append的任何明显内容,但是你可以使用SetFilePointer函数在写入之前寻找文件的末尾。