我正在使用 Visual C++ 2008。在 VC++ 2008 中,CFile
支持 2^64 个大文件。所以我觉得CStdioFile
也应该支持。
但是,在CStdioFile::GetLength()
大于 2GB 的文件上使用时,我得到一个CFileException
,下面是代码片段:
void CTestCStdioFileDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CStdioFile MyFile;
CString strLine;
ULONGLONG uLength;
strLine = _T("This is a line.");
if (MyFile.Open(_T("C:\\Temp\\MyTest.dat"), CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive | CFile::typeBinary))
{
for (UINT uIndex = 0; uIndex = 200000000; uIndex ++)
{
MyFile.WriteString(strLine);
uLength = MyFile.GetLength();
}
MyFile.Close();
}
}
跟踪到 后CStdio::GetLength()
,我发现以下代码段会引发异常,如下所示:
nCurrent = ftell(m_pStream); -> This will return -1
if (nCurrent == -1)
AfxThrowFileException(CFileException::invalidFile, _doserrno,
m_strFileName);
令人惊奇的是CStdioFile
仍然使用ftell
而不是_ftelli64
来处理流。
然后我搜索文档CStdioFile
,我找不到任何文档CStdioFile::GetLength
,唯一相关的是https://docs.microsoft.com/en-us/cpp/mfc/reference/cstdiofile-class?view=vs-2019#seek,它要求我查看fseek
文件。但是在fseek
文档中,我仍然没有找到任何与文件大小限制相关的内容。
最后我找到一个第三方网站,指出CStdioFile::GetLength
包含错误:http://www.flounder.com/msdn_documentation_errors_and_omissions.htm#CStdioFile::GetLength,但它没有提供解决方案。
除此之外,几乎没有任何关于CStdioFile
在线 2GB 限制的问题或帖子。这真的很奇怪。
我尝试检查CStdioFile
iN VC++ 2017 的源代码,它与 2008 的源代码相同。
CStdioFile
那么是否有不重写整个类的简单解决方案呢?