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

标签 c++ windows file-io fopen visual-c++-6

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

相关文章:

perl - 如何在 Perl 中创建目录?

python - 如何在 python 程序中处理来自 Windows 的文件切换

c++ - 无需强制转换即可分配具有不同数据类型地址的指针

c++ - 我如何从具有 X 元素的 std::vector 中的 p 中提取 n 个元素

C++模板参数类型推断

c++ - 从 C++ 到 MySQL 到 C++ 获取和设置 wchar_t 字符

c++ - 有什么可以代替多维数组吗?

windows - 如何停止在任务栏上显示我的应用程序?

.net - 无法加载 .Net 程序集

java - HttpClient + FileUpload 如何从 servlet 下载文件到我的应用程序?