CMemFile 类
支持内存文件的 CFile 派生类。
语法
class CMemFile : public CFile
成员
公共构造函数
名称 | 描述 |
---|---|
CMemFile::CMemFile | 构造内存文件对象。 |
公共方法
名称 | 描述 |
---|---|
CMemFile::Attach | 将内存块附加到 CMemFile 。 |
CMemFile::Detach | 从 CMemFile 中分离内存块,并返回指向已分离的内存块的指针。 |
CMemFile::GetBufferPtr | 获取或写入用于备份内存文件的内存缓冲区。 |
受保护方法
名称 | 描述 |
---|---|
CMemFile::Alloc | 进行替代以修改内存分配行为。 |
CMemFile::Free | 进行替代以修改内存解除分配行为。 |
CMemFile::GrowFile | 进行替代以修改文件扩展时的行为。 |
CMemFile::Memcpy | 进行替代,以修改读取和写入文件时的内存复制行为。 |
CMemFile::Realloc | 进行替代以修改内存重新分配行为。 |
备注
这些内存文件的行为与磁盘文件类似,但文件存储在 RAM 中,而不是存储在磁盘上。 内存文件适用于:
- 快速临时存储
- 在独立进程之间传输原始字节
- 在独立进程之间传输已序列化的对象
CMemFile
对象可自动分配自己的内存。 或者,你可调用 CMemFile
Attach 将自己的内存块附加到 对象。 无论是哪种情况,如果 nGrowBytes
不为零,都按 nGrowBytes
大小的增量分配用于自动扩展内容文件的内存。
如果内存最初由 CMemFile
对象进行分配,则在销毁 CMemFile
对象时将自动删除内存块;否则,你负责解除分配附加到该对象的内存。
可通过调用 Detach 从 CMemFile
对象分离时提供的指针访问内存块。
CMemFile
的最常见用途是,通过调用 CFile 成员函数来创建和使用 CMemFile
对象。 创建 CMemFile
会自动打开它:不调用 CFile::Open(它仅用于磁盘文件)。 CMemFile
不使用磁盘文件,因此不会使用数据成员 CFile::m_hFile
。
未针对 CMemFile
实现 CFile
成员函数 Duplicate、LockRange 和 UnlockRange。 如果在 CMemFile
对象上调用这些函数,将收到 CNotSupportedException。
CMemFile
使用运行时库函数 malloc、realloc 和 free 来分配、重新分配和解除分配内存;在读取和写入时使用内部 memcpy 阻止复制内存。 如果要更改此行为或 CMemFile
扩展文件时的行为,请从 CMemFile
中派生自己的类并替代相应的函数。
有关 CMemFile
的详细信息,请参阅 MFC 中的文件和内存管理 (MFC) 文章,并查看运行时库参考中的文件处理。
继承层次结构
CMemFile
要求
标头: afx.h
CMemFile::Alloc
此函数由 CMemFile
成员函数调用。
virtual BYTE* Alloc(SIZE_T nBytes);
参数
nBytes
要分配的内存字节数。
返回值
返回指向已分配的内存块的指针;如果分配失败,则返回 NULL。
注解
替代此函数以实现自定义内存分配。 如果替代此函数,则可能还需要替代 Free 和 Realloc。
默认实现使用运行时库函数 malloc 来分配内存。
CMemFile::Attach
调用此函数,将内存块附加到 CMemFile
。
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
参数
lpBuffer
指向要附加到 CMemFile
的缓冲区的指针。
nBufferSize
一个指定缓冲区大小(以字节为单位)的整数。
nGrowBytes
内存分配增量(以字节为单位)。
备注
这会导致 CMemFile
将内存块用作内存文件。
如果 nGrowBytes 为 0,CMemFile
会将文件长度设置为 nBufferSize。 这意味着,在内存块附加到 CMemFile
之前,内存块中的数据将用作文件。 无法扩展以这种方式创建的内存文件。
由于无法扩展文件,请注意不要导致 CMemFile
尝试扩展文件。 例如,不要调用 CFile:Write 的 CMemFile
替代来超出末尾写入,或者不要调用长度超过 nBufferSize 的 CFile:SetLength。
如果 nGrowBytes 大于 0,CMemFile
将忽略已附加的内存块的内容。 必须使用 CFile::Write
的 CMemFile
替代,从头开始写入内存文件的内容。 如果尝试通过调用 CFile::SetLength
的 CMemFile
替代来超过文件末尾写入或扩展文件,则 CMemFile
会按 nGrowBytes 的增量增加内存分配。 如果未使用与 Alloc 兼容的方法分配传递至 Attach
的内存块,则无法增加内存分配。 若要与 Alloc
的默认实现兼容,必须使用运行时库函数 malloc 或 calloc 分配内存。
CMemFile::CMemFile
第一个重载将打开一个空的内存文件。
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
参数
nGrowBytes
内存分配增量(以字节为单位)。
lpBuffer:指向接收 nBufferSize 大小相关信息的缓冲区的指针。
nBufferSize
一个指定文件缓冲区大小(以字节为单位)的整数。
备注
该文件由构造函数打开。 不要调用 CFile::Open。
第二个重载的作用相当于使用第一个构造函数并使用相同参数立即调用 Attach。 有关详细信息,请参阅Attach
。
示例
CMemFile f; // Ready to use - no Open necessary.
BYTE * pBuf = (BYTE *)new char [1024];
CMemFile g(pBuf, 1024, 256);
// same as CMemFile g; g.Attach(pBuf, 1024, 256);
CMemFile::Detach
调用此函数以获取指向 CMemFile
正在使用的内存块的指针。
BYTE* Detach();
返回值
指向包含内存文件内容的内存块的指针。
备注
调用此函数也会关闭 CMemFile
。 可通过调用 Attach 将内存块重新附加至 CMemFile
。 如果要重新附加文件并使用该文件中的数据,则应调用 CFile::GetLength 来获取文件的长度,然后再调用 Detach
。 如果将内存块附加到 CMemFile
,以便可使用其数据 (nGrowBytes
== 0),则无法扩展内存文件。
CMemFile::Free
此函数由 CMemFile
成员函数调用。
virtual void Free(BYTE* lpMem);
参数
lpMem
指向要解除分配的内存的指针。
备注
替代此函数以实现自定义内存解除分配。 如果替代此函数,则可能还需要替代 Alloc 和 Realloc。
CMemFile::GetBufferPtr
获取或写入用于备份内存文件的内存缓冲区。
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
参数
nCommand
要执行的 bufferCommand(bufferCheck
、bufferCommit
、bufferRead
或 bufferWrite
)。
nCount
根据 nCommand,缓冲区中要读取、写入或提交的字节数。 从缓冲区读取时,请指定 -1,将缓冲区从当前位置返回到文件末尾。
ppBufStart
[out] 缓冲区的开始。 当 nCommand 为 bufferCommit
时,必须是 NULL
。
ppBufMax
[out] 缓冲区的末尾。 当 nCommand 为 bufferCommit
时,必须是 NULL
。
返回值
命令值 | 返回值 |
---|---|
buffercheck |
如果支持直接缓冲,则返回 bufferDirect;否则返回 0。 |
bufferCommit |
返回 0 |
bufferRead 或 bufferWrite |
[out] 返回的缓冲空间中的字节数。 ppBufStart 和 ppBufMax 分别指向读/写缓冲区的开始和结束。 |
注解
内存缓冲区中的当前位置 (m_nPosition
) 根据 nCommand 按以下方式前进:
nCommand | 缓冲区位置 |
---|---|
bufferCommit |
按已提交的缓冲区大小前进的当前位置。 |
bufferRead |
按读取的缓冲区大小前进的当前位置。 |
CMemFile::GrowFile
此函数由多个 CMemFile
成员函数调用。
virtual void GrowFile(SIZE_T dwNewLen);
参数
dwNewLen
内存文件的新大小。
注解
如果要更改 CMemFile
扩展其文文件的方式,可替代它。 默认实现调用 Realloc 来增大现有块(或使用 Alloc 来创建内存块),从而按构造函数或 Attach 调用中指定的 nGrowBytes
的倍数分配内存。
CMemFile::Memcpy
此函数由 CFile::Read 和 CFile::Write 的 CMemFile
替代项调用,以便将数据传入和传出内存文件。
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
参数
lpMemTarget
指向要将源内存复制到的内存块的指针。
lpMemSource
指向源内存块的指针。
nBytes
要复制的字节数。
返回值
lpMemTarget 的副本。
备注
如果要更改 CMemFile
执行这些内存副本的方式,请替代此函数。
CMemFile::Realloc
此函数由 CMemFile
成员函数调用。
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
参数
lpMem
指向要重新分配的内存块的指针。
nBytes
内存块的新大小。
返回值
返回指向重新分配(并可能已移动)的内存块的指针;如果重新分配失败,则返回 NULL。
备注
替代此函数以实现自定义内存重新分配。 如果替代此函数,则可能还需要替代 Alloc 和 Free。