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

Posted

技术标签:

【中文标题】如何获取 CArchive 中引用的文件的大小?【英文标题】:How can I get the size of the file referenced in a CArchive? 【发布时间】:2017-11-01 13:28:28 【问题描述】:

在使用 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 选择文件后调用它。我想弄清楚的是:

    我如何知道调用中引用的文件的大小? 我怎样才能知道引用的文件的名称是什么?

这是我近 10 年来在这里提出的第一个问题,所以请保持温和,不要告诉我我的问题格式不正确或其他事情。

【问题讨论】:

GetFile() 成员会有所帮助。 【参考方案1】: 使用ar.GetFile()->GetFilePath()获取文件的完整路径(reference) 使用ar.GetFile()->GetLength() 获取文件大小。 (reference)

【讨论】:

【参考方案2】:

通常,您可以像编写它一样以相反的方式解码 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,您会发现相同的方式。

请注意,在这种情况下,文件会变成二进制文件。并且不再只是“文本”。

【讨论】:

以上是关于如何获取 CArchive 中引用的文件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中读取 CArchive 布尔值

反序列化在 java 中使用 mfc CArchive 创建的文件

CFile与CArchive区别

读取使用 CArchive Ar(&SaveDataStoreDetail, CArchive::store) 存储的数据;

当只有链接可用时如何获取文件的总文件大小

使用 CArchive::GetObjectSchema 返回错误值