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

我在 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
}

解决方法

答案:

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...