关于C#:CreateFile始终会覆盖指定的文件

CreateFile always override the specified file

我正在尝试记录由我使用Windows-API编写的服务所执行的操作


即使打开现有文件,也没有指定要附加到该文件。因此,它作为通用写入打开,最终您覆盖了内容。您需要将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))
    {


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

尽管它可能不会引起您的实际问题,但如果您的第一次尝试失败了,我将替换您当前的逻辑,尝试将CreateFile用于OPEN_EXSTING,然后用于CREATE_NEW。相反,只需传递OPEN_ALWAYS标志,该标志几乎可以自动执行该逻辑-如果存在则打开一个现有文件,如果不存在则创建一个新文件。


在CreateFile文档中,我看不到有关打开Append的任何明显信息,但是您可以使用SetFilePointer
函数在写入之前先查找文件的末尾。


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