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

时间:2011-01-14 10:19:18

标签: c++ windows file-io fopen vc6

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

我试过了:

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

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

代码在下面,我没有看到任何奇怪的东西,它看起来很标准我。源文件在短短半年内没有改变。

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

5 个答案:

答案 0 :(得分:10)

答案:

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

答案 1 :(得分:2)

你的函数有一个HRESULT返回类型(其中0表示好)但你返回一个布尔值(其中0表示错误)。那可能不对......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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