gpt4 book ai didi

c++ - 为什么 fopen 无法打开存在的文件?

转载 作者:可可西里 更新时间:2023-11-01 13:18:38 25 4
gpt4 key购买 nike

我在 Windows XP 上使用 Visual Studio 6(是的,我知道它很旧)构建/维护一个 C++ DLL。我遇到了 fopen 无法打开现有文件的问题,它总是返回 NULL。

我试过:

  • 通过将 errno 和 _doserrno 都设置为零然后再次检查它们来检查它们,两者都保持为零,因此 GetLastError() 报告没有错误。我知道根据 C 标准 fopen 在遇到错误时不需要设置 errno。
  • 硬编码文件路径,这不是相对的。
  • 在另一台开发人员机器上试过,结果相同。

真正奇怪的是 CreateFile 可以工作,并且可以使用 ReadFile 读取文件。我们相信这适用于发布版本,但我们也在应用程序的其他区域看到一些非常奇怪的行为,我们不确定这是否相关。

代码如下,我没有发现任何奇怪的地方,它看起来很标准。源文件不到半年没有更改。

HRESULT CDataHandler::LoadFile( CStdString szFilePath )
{
//Code
FILE* pFile;
if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) )
{
return S_FALSE;
}
//More code
}

最佳答案

答案:

我找到了原因,最近对应用程序的一些更新导致打开的文件句柄过多。这些地方没有代码更改,所以这个错误已经存在了一段时间。我进入 fopen 函数直到一个名为 _getstream 的函数。这试图找到一个未使用的流,该函数搜索一个包含 512 个流的表,果然所有 512 个都在使用中,而其他对 fopen 的调用失败了。我用了handle来自 sysinternals 的工具,用于查看已用句柄的数量。

关于c++ - 为什么 fopen 无法打开存在的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4690018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com