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 对象可自动分配自己的内存。 或者,你可调用 CMemFileAttach 将自己的内存块附加到 对象。 无论是哪种情况,如果 nGrowBytes 不为零,都按 nGrowBytes 大小的增量分配用于自动扩展内容文件的内存。

如果内存最初由 CMemFile 对象进行分配,则在销毁 CMemFile 对象时将自动删除内存块;否则,你负责解除分配附加到该对象的内存。

可通过调用 DetachCMemFile 对象分离时提供的指针访问内存块。

CMemFile 的最常见用途是,通过调用 CFile 成员函数来创建和使用 CMemFile 对象。 创建 CMemFile 会自动打开它:不调用 CFile::Open(它仅用于磁盘文件)。 CMemFile 不使用磁盘文件,因此不会使用数据成员 CFile::m_hFile

未针对 CMemFile 实现 CFile 成员函数 DuplicateLockRangeUnlockRange。 如果在 CMemFile 对象上调用这些函数,将收到 CNotSupportedException

CMemFile 使用运行时库函数 mallocreallocfree 来分配、重新分配和解除分配内存;在读取和写入时使用内部 memcpy 阻止复制内存。 如果要更改此行为或 CMemFile 扩展文件时的行为,请从 CMemFile 中派生自己的类并替代相应的函数。

有关 CMemFile 的详细信息,请参阅 MFC 中的文件内存管理 (MFC) 文章,并查看运行时库参考中的文件处理

继承层次结构

CObject

CFile

CMemFile

要求

标头: afx.h

CMemFile::Alloc

此函数由 CMemFile 成员函数调用。

virtual BYTE* Alloc(SIZE_T nBytes);

参数

nBytes
要分配的内存字节数。

返回值

返回指向已分配的内存块的指针;如果分配失败,则返回 NULL。

注解

替代此函数以实现自定义内存分配。 如果替代此函数,则可能还需要替代 FreeRealloc

默认实现使用运行时库函数 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:WriteCMemFile 替代来超出末尾写入,或者不要调用长度超过 nBufferSize 的 CFile:SetLength

如果 nGrowBytes 大于 0,CMemFile 将忽略已附加的内存块的内容。 必须使用 CFile::WriteCMemFile 替代,从头开始写入内存文件的内容。 如果尝试通过调用 CFile::SetLengthCMemFile 替代来超过文件末尾写入或扩展文件,则 CMemFile 会按 nGrowBytes 的增量增加内存分配。 如果未使用与 Alloc 兼容的方法分配传递至 Attach 的内存块,则无法增加内存分配。 若要与 Alloc 的默认实现兼容,必须使用运行时库函数 malloccalloc 分配内存。

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
指向要解除分配的内存的指针。

备注

替代此函数以实现自定义内存解除分配。 如果替代此函数,则可能还需要替代 AllocRealloc

CMemFile::GetBufferPtr

获取或写入用于备份内存文件的内存缓冲区。

virtual UINT GetBufferPtr(
    UINT nCommand,
    UINT nCount = 0,
    void** ppBufStart = NULL,
    void** ppBufMax = NULL
);

参数

nCommand
要执行的 bufferCommandbufferCheckbufferCommitbufferReadbufferWrite)。

nCount
根据 nCommand,缓冲区中要读取、写入或提交的字节数。 从缓冲区读取时,请指定 -1,将缓冲区从当前位置返回到文件末尾。

ppBufStart
[out] 缓冲区的开始。 当 nCommand 为 bufferCommit 时,必须是 NULL

ppBufMax
[out] 缓冲区的末尾。 当 nCommand 为 bufferCommit 时,必须是 NULL

返回值

命令值 返回值
buffercheck 如果支持直接缓冲,则返回 bufferDirect;否则返回 0。
bufferCommit 返回 0
bufferReadbufferWrite [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::ReadCFile::WriteCMemFile 替代项调用,以便将数据传入和传出内存文件。

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。

备注

替代此函数以实现自定义内存重新分配。 如果替代此函数,则可能还需要替代 AllocFree

另请参阅

CFile 类
层次结构图