Я использую Visual C ++ 2008. В VC ++ 2008 CFile
поддерживает 2 ^ 64 огромных файла. Поэтому я думаю, что CStdioFile
также должен поддерживать.
Однако при использовании CStdioFile::GetLength()
для файла размером более 2 ГБ я получаю 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 , но это не дает решения.
Кроме этого, вряд ли есть какие-либо вопросы или сообщения о 2 ГБ в CStdioFile
в Интернете. Это действительно странно.
Я пытаюсь проверить исходный код CStdioFile
iN VC ++ 2017, и он такой же, как и для 2008 года.
Итак, есть ли простое решение проблемы без перезаписи всего CStdioFile
класс?