Как я могу получить размер файла, на который есть ссылка в CArchive?
Я только начал годами возвращаться в C++, используя Perl, php и ассемблер, и я пытаюсь создать простую программу MFC, используя Visual Studio 2017 и C++, чтобы открывать двоичные файлы для просмотра. Я пытаюсь работать в коде, созданном мастером, и я получил в тупик. Я знаю, что это, вероятно, не лучший способ делать то, что я хочу делать, но я учусь.
В любом случае код, над которым я работаю:
void CAdamImageManagerDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
char documentBuffer[1000];
ar.Read(documentBuffer, 1000);
AfxMessageBox((LPCTSTR)documentBuffer);
}
}
Это вызывается после выбора файла с помощью стандартного диалогового окна открытия файла MFC OnFileOpen. То, что я пытаюсь выяснить, это:
- Как я могу узнать, каков размер файла, на который была ссылка в вызове?
- Как я могу узнать, как называется файл, на который есть ссылка?
Это мой первый вопрос за последние 10 лет, поэтому, пожалуйста, будьте осторожны и не говорите мне, как я не отформатировал вопрос должным образом или что-то еще.
2 ответа
В общем случае вы декодируете поток CArchive в обратном порядке, как вы его пишете.
Таким образом, в большинстве случаев нет необходимости знать размер файла. Сериализация n элементов в основном выполняется с использованием CObList
или же CObArray
или вы просто записываете размер блока данных в архив, за которым следуют байты. Точно так же вы можете декодировать поток.
if (ar.IsStoring())
{
DWORD dwSize = m_lenData;
ar << dwSize;
ar.Write(documentBuffer, dwSize);
}
else
{
DWORD dwSize;
ar >> dwSize;
ar.Read(documentBuffer, dwSize);
}
Если вы посмотрите на код MFC, как сериализуется CString или как сериализуется CObArray, вы найдете тот же путь.
Обратите внимание, что в этом случае файл превращается в двоичный файл. И уже не просто "текст".