CMemFile 类

支持内存文件的CFile派生类。

语法

class CMemFile : public CFile

成员

公共构造函数

名称 说明
CMemFile:: CMemFile 构造内存文件对象。

公共方法

“属性” 说明
CMemFile:: Attach 将内存块附加到 CMemFile
CMemFile::D etach 从分离内存块 CMemFile ,并返回指向已分离内存块的指针。
CMemFile:: GetBufferPtr 获取或写入用于支持内存文件的内存缓冲区。

受保护的方法

名称 说明
CMemFile::分配 重写以修改内存分配行为。
CMemFile:: Free 重写以修改内存释放行为。
CMemFile:: GrowFile 重写以在增大文件时修改行为。
CMemFile:: Memcpy 重写以修改读取和写入文件时的内存复制行为。
CMemFile:: Realloc 重写以修改内存重新分配行为。

备注

这些内存文件的行为类似于磁盘文件,但文件存储在 RAM 中,而不是存储在磁盘上。 内存文件适用于:

  • 快速临时存储
  • 在独立进程之间传输原始字节
  • 在独立进程之间传输序列化对象

CMemFile对象可以自动分配其自己的内存。 或者,可以通过调用 Attach 将自己的内存块附加到 CMemFile 对象Attach。 在这两种情况下,如果不是零,则会按大小增加自动分配内存文件的内存 nGrowBytes nGrowBytes

如果对象最初由对象分配,则内存块将在对象被销毁时自动删除 CMemFile CMemFile ; 否则,您需要负责释放附加到对象的内存。

通过调用分离,可以通过在从对象分离时提供的指针访问内存块 CMemFileDetach

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

CFile不会为Duplicate实现成员函数LockRangeUnlockRange CMemFile 。 如果在对象上调用这些函数 CMemFile ,将获得一个CNotSupportedException

CMemFile使用运行时库函数mallocreallocfree ,以分配、重新分配和释放内存;在读取和写入时,用于阻止复制内存的内部memcpy 。 如果要更改此行为或增长文件时的行为 CMemFile ,请从派生您自己的类, CMemFile 并重写相应的函数。

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

继承层次结构

CObject

CFile

CMemFile

要求

标头: afx

CMemFile::分配

此函数由 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 尝试增长文件。 例如,请不要调用 CMemFile CFile: write的替代以写入结束,或不要调用长度超过NBufferSizeCFile: SetLength

如果nGrowBytes大于0, CMemFile 将忽略附加的内存块的内容。 您必须使用的替代从头开始编写内存文件的内容 CMemFile CFile::Write 。 如果尝试写入超过文件末尾的文件或通过调用的重写来增长文件 CMemFile CFile::SetLengthCMemFile 则将以nGrowBytes的增量增长内存分配。 如果传递到的内存块未 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::D etach

调用此函数可获取指向正在使用的内存块的指针 CMemFile

BYTE* Detach();

返回值

指向包含内存文件内容的内存块的指针。

备注

调用此函数也会关闭 CMemFile 。 可以 CMemFile 通过调用Attach将内存块重新附加到。 如果要重新附加文件并使用其中的数据,则应调用CFile:: GetLength以获取文件的长度,然后再调用 Detach 。 如果将内存块附加到, CMemFile 以便可以使用其数据( nGrowBytes = = 0),则不能增加内存文件。

CMemFile:: Free

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

virtual void Free(BYTE* lpMem);

参数

lpMem
指向要释放的内存的指针。

备注

重写此函数以实现自定义内存释放。 如果重写此函数,则可能还需要重写分配Realloc

CMemFile:: GetBufferPtr

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

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

参数

N 命令
要执行的bufferCommandbufferCheckbufferCommitbufferReadbufferWrite )。

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

ppBufStart
弄缓冲区的开头。 NULLn 命令为时,必须为 bufferCommit

ppBufMax
弄缓冲区的末尾。 NULL当 n 命令为时,必须为 bufferCommit

返回值

命令 返回值
buffercheck 如果支持直接缓冲,则返回bufferDirect ,否则返回0。
bufferCommit 返回 0
bufferReadbufferWrite 返回返回的缓冲区空间中的字节数。 ppBufStartppBufMax指向读取/写入缓冲区的开头和结尾。

备注

内存缓冲区()中的当前位置 m_nPosition 是高级的,具体取决于n 命令

N 命令 缓冲区位置
bufferCommit 当前位置按提交的缓冲区的大小前进。
bufferRead 当前位置按读取缓冲区的大小前进。

CMemFile:: GrowFile

此函数由若干个 CMemFile 成员函数调用。

virtual void GrowFile(SIZE_T dwNewLen);

参数

dwNewLen
内存文件的新大小。

备注

如果要更改其文件的增长方式,可以重写它 CMemFile 。 默认实现将调用Realloc来扩大现有块(或分配到创建内存块),并以 nGrowBytes 构造函数中指定的值的倍数分配内存或附加调用。

CMemFile:: Memcpy

此函数由 CMemFile CFile:: ReadCFile:: Write的重写调用,以将数据传入和传出内存文件。

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。

备注

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

另请参阅

CFile 类
层次结构图