CreateFile always override the specified file
我正在尝试记录由我使用Windows-API编写的服务所执行的操作
- 顺便说一句,您可以使用OPEN_ALWAYS简化此代码,它告诉CreateFile打开文件(如果存在)或创建文件(如果不存在)。这样,您就不必重复太多代码了。
即使打开现有文件,也没有指定要附加到该文件。因此,它作为通用写入打开,最终您覆盖了内容。您需要将FILE_APPEND_DATA标志传递给CreateFile方法。最好使用包含FILE_APPEND_DATA
的FILE_GENERIC_WRITE标志来完成此操作
1 2 3 4
| 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))
{ |
- 这很好。您知道是否有办法保持换行吗?看来它跳过了我的...
-
如果您使用此标志,则不应更改@tsabz新行。您在将它们写出来时遇到问题吗?您可能需要手动添加它们,因为WriteFile本身不会为您添加它们。
-
我这样调用函数:WriteInLogFile("LOG: somethingtowrite\
");,它不保留换行符。
-
@tsabz尝试使用\
\
而不是\
-
使用FILE_GENERIC_WRITE对我不起作用。直接使用FILE_APPEND_DATA做到了!想知道为什么。
打开文件时,指针将始终定位在文件的开头。要追加,您需要明确地寻找到结尾(SetFilePointer(hFile, 0, 0, FILE_END);)。
尽管它可能不会引起您的实际问题,但如果您的第一次尝试失败了,我将替换您当前的逻辑,尝试将CreateFile用于OPEN_EXSTING,然后用于CREATE_NEW。相反,只需传递OPEN_ALWAYS标志,该标志几乎可以自动执行该逻辑-如果存在则打开一个现有文件,如果不存在则创建一个新文件。
-
谢谢,我将您的答案与JaredPar的答案混合在一起,现在一切都变好了:)
在CreateFile文档中,我看不到有关打开Append的任何明显信息,但是您可以使用SetFilePointer
函数在写入之前先查找文件的末尾。
在使用SetFilePointer进行写入之前,需要将文件指针设置为文件末尾。请参见MSDN示例。