如何获取 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 个元素主要是使用 CObList
或 CObArray
完成的,或者您只需将数据块的大小写入存档,然后是 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 中引用的文件的大小?的主要内容,如果未能解决你的问题,请参考以下文章
反序列化在 java 中使用 mfc CArchive 创建的文件
读取使用 CArchive Ar(&SaveDataStoreDetail, CArchive::store) 存储的数据;