如何获取CArchive中引用的文件的大小?

时间:2017-11-01 13:28:29

标签: visual-c++ mfc carchive

我刚刚开始使用Perl,php和汇编程序回到c ++,我正在尝试使用Visual Studio 2017和c ++创建一个简单的MFC程序来打开二进制文件进行查看。我试图在向导创建的代码中工作,我已经难倒了。我知道这可能不是做我想做的最好的方式,但我正在学习。

无论如何,我正在处理的代码是:

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. 如何找出所引用文件的名称?
  3. 这是我近10年来的第一个问题所以请保持温和,不要告诉我如何正确地格式化问题或其他事情。

2 个答案:

答案 0 :(得分:3)

  • 使用ar.GetFile()->GetFilePath()获取文件的完整文件路径(reference
  • 使用ar.GetFile()->GetLength()获取文件大小。 (reference

答案 1 :(得分:2)

通常,您可以像编写CArchive一样以相反的方式解码CArchive的流。

因此在大多数情况下,无需知道文件的大小。序列化n个元素主要是使用CObListCObArray完成的,或者只是将数据块的大小写入归档,然后是BYTE。与解码流的方式相同。

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,您会发现相同的方式。

请注意,在这种情况下,文件将变为二进制文件。而且不再只是&#34;文字&#34;。