Как я могу получить размер файла, на который есть ссылка в 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. То, что я пытаюсь выяснить, это:

  1. Как я могу узнать, каков размер файла, на который была ссылка в вызове?
  2. Как я могу узнать, как называется файл, на который есть ссылка?

Это мой первый вопрос за последние 10 лет, поэтому, пожалуйста, будьте осторожны и не говорите мне, как я не отформатировал вопрос должным образом или что-то еще.

2 ответа

  • использование ar.GetFile()->GetFilePath() чтобы получить полный путь к файлу ( ссылка)
  • использование ar.GetFile()->GetLength() чтобы получить размер файла. ( ссылка)

В общем случае вы декодируете поток 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, вы найдете тот же путь.

Обратите внимание, что в этом случае файл превращается в двоичный файл. И уже не просто "текст".

Другие вопросы по тегам