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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:13:16