如何在C语言WinAPI中实现:文件存在则打开写入,不存在则创建?
解决CreateFileW文件已存在时无法写入的问题
你当前使用CREATE_NEW作为dwCreationDisposition参数,这个参数的特性是仅当目标文件不存在时创建新文件,若文件已存在则直接返回错误,这就是导致后续WriteFile失败的原因。要实现“不存在则创建,存在则打开写入”的需求,有两种常用方案:
方案一:直接使用OPEN_ALWAYS参数(简洁版)
将CREATE_NEW替换为OPEN_ALWAYS,该参数会自动处理两种场景:文件不存在时创建新文件,文件已存在时直接打开已有文件。打开后文件指针默认位于开头,写入会覆盖原有内容(和你原代码的写入逻辑一致)。
修改后的代码:
HANDLE hFile; hFile = CreateFileW(L"D:\\winApiFiles\\file1.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, // 替换原CREATE_NEW参数 FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { // 处理其他错误(如权限不足、路径不存在等) DWORD err = GetLastError(); // 可根据err值做对应处理,比如输出错误信息 return; } // 执行WriteFile写入操作 // ... // 记得关闭句柄 CloseHandle(hFile);
方案二:先尝试创建,失败再打开(严谨版)
如果你希望严格执行“优先创建新文件,仅当文件已存在时才打开”的逻辑,可以保留CREATE_NEW,通过判断错误码来触发后续打开操作:
HANDLE hFile = CreateFileW(L"D:\\winApiFiles\\file1.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); if (err == ERROR_FILE_EXISTS) { // 文件已存在,打开已有文件 hFile = CreateFileW(L"D:\\winApiFiles\\file1.txt", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } else { // 处理其他错误(如路径无效、权限不足等) return; } } if (hFile == INVALID_HANDLE_VALUE) { // 打开已有文件也失败,处理错误 return; } // 执行WriteFile写入操作 // ... CloseHandle(hFile);
补充说明
- 如果需要追加写入而不是覆盖原有内容,打开文件后可以调用
SetFilePointer(hFile, 0, NULL, FILE_END)将文件指针移到末尾,再执行WriteFile。 - 无论哪种方案,使用完文件句柄后都要调用
CloseHandle释放资源。
内容的提问来源于stack exchange,提问作者nat34
相关产品推荐
相关产品推荐

