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

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

我试过了:

  • 检查errno和_doserrno通过设置为零,然后再次检查它们都保留为零,因此GetLastError()报告没有错误。 我知道fopen在按照C标准遇到错误时不需要设置errno。
  • 硬编码的文件path,这是不相关的。
  • 试了另一个开发者机器,结果相同。

真正奇怪的是CreateFile的作品和文件可以读取文件。 我们相信这是一个发布版本,但是我们在应用程序的其他领域也看到了一些非常奇怪的行为,我们不确定这是否是相关的。

代码如下,我没有看到任何奇怪的,它看起来相当标准的我。 源文件在半年之内没有改变。

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

答案:

我发现原因,由于应用程序最近的一些更新导致打开的文件句柄过多。 这些代码没有改变,但这个bug已经存在了一段时间。 我进入了一个名为_getstream的函数fopen函数。 这试图找到一个没有使用的流,功能查找512个流的表肯定是所有的512在哪里使用和其他调用哪里失败。 我使用sysinternals的句柄工具来查看使用的句柄的数量。

你的函数有一个HRESULT返回类型(其中0是好的),但你返回一个布尔值(其中0是坏的)。 这是不对的…

假设你有一个合理的VC6版本,那么你有CRT的源代码,你可以进入fopen调用,一直到CRT的CreateFile调用。 (准备好了,相当长的一段路!)

在fopen行上放置断点,在调试器中触发,在“Watch”窗口中输入“ ERR,hr ”,执行行并检查看看有什么问题。 最有可能的是它的访问权限。

你已经有512个打开的文件。

我们只能在VC应用程序中保存最多512个打开的文件。 我建议使用fclose关闭不必要的文件。