使用CreateFile()打开文件返回无效句柄,错误码183求助
问题原因及解决办法
核心原因
你遇到的问题本质是Visual Studio调试时的工作目录和可执行文件所在目录不一致:
- 直接运行exe时,程序的工作目录就是exe所在的输出目录(比如
x64/Debug),这里有你放置的file.mp4,所以能正常打开。 - 但VS默认调试时,工作目录是你的项目根目录(不是exe输出目录),而你把
file.mp4放在了exe所在的输出目录里,导致程序找不到文件,CreateFile返回无效句柄。 - 你提到的错误码183应该是之前测试时写文件的残留错误,实际读文件失败对应的错误码应该是
2(ERROR_FILE_NOT_FOUND),可以重新打印确认。
解决办法
有三种方式可以解决:
- 修改VS调试工作目录:右键项目 → 属性 → 调试 → 工作目录,改成
$(OutDir),这样VS调试时就会用exe所在的输出目录作为工作目录,能找到file.mp4。 - 移动文件位置:把
file.mp4复制到你的项目根目录下(即.vcxproj文件所在的目录),这样VS默认调试时就能找到文件。 - 使用绝对路径或动态获取路径:在代码里用绝对路径指定
file.mp4的位置,或者通过GetModuleFileName获取当前exe的路径,再拼接出file.mp4的路径,这样不管在哪运行都能找到文件。
代码额外优化点
你的复制逻辑有个小问题:WriteFile时用了BUFFER_LENGTH作为写入长度,但最后一次ReadFile可能读不满2048字节,这时候写入整个缓冲区会导致复制出来的out.mp4比原文件大(多了memset填充的0),应该改成用实际读取的readCount作为写入长度:
if (!WriteFile(hWriteFile, buffer, readCount, &readCount, NULL)) { // 错误处理 }
另外,memset(buffer, 0, sizeof(buffer))是多余的,下一次ReadFile会覆盖缓冲区内容,不需要手动清空。
内容的提问来源于stack exchange,提问作者Zombies are Real
相关产品推荐
相关产品推荐

