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
相关产品推荐
相关产品推荐

