You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WriteFile无法追加内容总是覆盖,如何实现文件追加写入?

问题描述

以下代码尝试打开已存在的test.txt文件,期望将字符串"line-to-be-appened\r\n"追加到文件末尾,但实际执行时会覆盖原有内容:

HANDLE hFile = CreateFile("test.txt", FILE_GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

ULONG nWritten = 0;
WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);

CloseFile(hFile);

请问如何修改代码以实现追加写入?

修改方案

要实现追加写入,可通过两种可靠方式调整代码,同时注意修正API调用错误:

方式一:使用FILE_APPEND_DATA权限(推荐)

调用CreateFile时,将访问权限指定为FILE_APPEND_DATA,系统会自动将文件指针定位到末尾,所有写入操作都会追加到现有内容之后,还能避免多线程场景下的指针竞争问题。同时需修正原代码中错误的CloseFile,改用Windows标准APICloseHandle:

HANDLE hFile = CreateFile("test.txt", FILE_APPEND_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE) {
    ULONG nWritten = 0;
    WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);
    
    CloseHandle(hFile);
}

方式二:手动移动文件指针到末尾

如果仍需保留FILE_GENERIC_WRITE权限,可在打开文件后,调用SetFilePointer将指针移至文件末尾,再执行写入:

HANDLE hFile = CreateFile("test.txt", FILE_GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE) {
    // 将文件指针移动到文件末尾
    SetFilePointer(hFile, 0, NULL, FILE_END);
    
    ULONG nWritten = 0;
    WriteFile(hFile, "line-to-be-appened\r\n", strlen("line-to-be-appened\r\n"), &nWritten, NULL);
    
    CloseHandle(hFile);
}

关键修正点

  • 原代码中的CloseFile是错误调用,Windows平台必须使用CloseHandle关闭文件句柄,否则会造成资源泄漏。

内容的提问来源于stack exchange,提问作者HaeRim Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:52:39