Clase CMemFile
Clase derivada de CFile que admite archivos de memoria.
Sintaxis
class CMemFile : public CFile
Miembros
Constructores públicos
Nombre | Descripción |
---|---|
CMemFile::CMemFile | Construye un objeto de archivo de memoria. |
Métodos públicos
Nombre | Descripción |
---|---|
CMemFile::Attach | Asocia un bloque de memoria a CMemFile . |
CMemFile::Detach | Desasocia el bloque de memoria de CMemFile y devuelve un puntero al bloque de memoria desasociado. |
CMemFile::GetBufferPtr | Obtener o escribir en el búfer de memoria que respalda un archivo de memoria. |
Métodos protegidos
Nombre | Descripción |
---|---|
CMemFile::Alloc | Invalidar para modificar el comportamiento de la asignación de memoria. |
CMemFile::Free | Invalidar para modificar el comportamiento de la desasignación de memoria. |
CMemFile::GrowFile | Invalidar para modificar el comportamiento al aumentar el tamaño de un archivo. |
CMemFile::Memcpy | Invalidar para modificar el comportamiento de copia de memoria al leer y escribir archivos. |
CMemFile::Realloc | Invalidar para modificar el comportamiento de la reasignación de memoria. |
Comentarios
Estos archivos de memoria se comportan como los archivos de disco, excepto que el archivo se almacena en RAM en lugar de en el disco. Un archivo de memoria es útil para:
- almacenamiento temporal rápido
- transferencia de bytes sin procesar entre procesos independientes
- transferencia de objetos serializados entre procesos independientes
Los objetos CMemFile
pueden asignar automáticamente su propia memoria. También puede asociar su propio bloque de memoria al objeto CMemFile
mediante una llamada a Attach. En cualquier caso, la memoria usada para aumentar automáticamente el tamaño del archivo de memoria se asigna en incrementos de un tamaño de nGrowBytes
si nGrowBytes
es distinto de 0.
El bloque de memoria se eliminará automáticamente tras la destrucción del objeto CMemFile
si el objeto CMemFile
asignó originalmente la memoria; de lo contrario, es responsable de desasignar la memoria asociada al objeto.
Puede acceder al bloque de memoria mediante el puntero proporcionado al desasociarlo del objeto CMemFile
llamando a Detach.
El uso más común de CMemFile
es crear un objeto CMemFile
y usarlo mediante una llamada a las funciones miembro de CFile. La creación de una instancia de CMemFile
lo abre automáticamente: no llame a CFile::Open, que solo se usa para los archivos de disco. Dado que CMemFile
no usa un archivo de disco, no se usa el miembro de datos CFile::m_hFile
.
Las funciones miembro Duplicate, LockRange y UnlockRange de CFile
no se han implementado para CMemFile
. Si llama a estas funciones en un objeto CMemFile
, obtendrá una excepción CNotSupportedException.
CMemFile
usa las funciones de la biblioteca en tiempo de ejecución malloc, realloc y free para asignar, reasignar y desasignar memoria; y la función intrínseca memcpy para copiar la memoria en bloque al leer y escribir. Si desea cambiar este comportamiento o el comportamiento cuando CMemFile
aumenta el tamaño de un archivo, derive su propia clase de CMemFile
e invalide las funciones adecuadas.
Para obtener más información sobre CMemFile
, consulte los artículos Archivos en MFC y Administración de memoria, y consulte Control de archivos en la Referencia de la biblioteca en tiempo de ejecución.
Jerarquía de herencia
CMemFile
Requisitos
Encabezado: afx.h
CMemFile::Alloc
Las funciones miembro de CMemFile
llaman a esta función.
virtual BYTE* Alloc(SIZE_T nBytes);
Parámetros
nBytes
Número de bytes de memoria que se van a asignar.
Valor devuelto
Puntero al bloque de memoria que se ha asignado o NULL si se produjo un error en la asignación.
Comentarios
Invalide esta función para implementar la asignación de memoria personalizada. Si invalida esta función, probablemente también querrá invalidar Free y Realloc.
La implementación predeterminada usa la función malloc de la biblioteca en tiempo de ejecución para asignar memoria.
CMemFile::Attach
Llame a esta función para asociar un bloque de memoria a CMemFile
.
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parámetros
lpBuffer
Puntero al búfer que se va a asociar a CMemFile
.
nBufferSize
Un entero que especifica el tamaño del búfer en bytes.
nGrowBytes
Incremento de asignación de memoria expresado en bytes.
Comentarios
Esto hace que CMemFile
use el bloque de memoria como archivo de memoria.
Si nGrowBytes es 0, CMemFile
establecerá la longitud del archivo en nBufferSize. Esto significa que los datos del bloque de memoria antes de que se asocie a CMemFile
se usarán como archivo. Los archivos de memoria creados de esta manera no se pueden aumentar de tamaño.
Dado que el archivo no se puede aumentar de tamaño, tenga cuidado de no hacer que CMemFile
intente hacer aumentar el tamaño del archivo. Por ejemplo, no llame a las invalidaciones de CFile:Write de CMemFile
para escribir más allá del final ni llame a CFile:SetLength con una longitud mayor que nBufferSize.
Si nGrowBytes es mayor que 0, CMemFile
omitirá el contenido del bloque de memoria que ha asociado. Tendrá que escribir el contenido del archivo de memoria desde cero mediante la invalidación de CFile::Write
de CMemFile
. Si intenta escribir después del final del archivo o aumentar el tamaño del archivo llamando a la invalidación de CFile::SetLength
de CMemFile
, CMemFile
aumentará la asignación de memoria en incrementos de nGrowBytes. Al aumentar la asignación de memoria, se producirá un error si el bloque de memoria que se pasa a Attach
no se asignó con un método compatible con Alloc. Para ser compatible con la implementación predeterminada de Alloc
, debe asignar la memoria con la función malloc o calloc de la biblioteca en tiempo de ejecución.
CMemFile::CMemFile
La primera sobrecarga abre un archivo de memoria vacío.
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parámetros
nGrowBytes
Incremento de asignación de memoria expresado en bytes.
lpBuffer Puntero a un búfer que recibe información con el tamaño indicado en nBufferSize.
nBufferSize
Número entero que especifica el tamaño del búfer del archivo, en bytes.
Comentarios
El constructor abre el archivo. No llame a CFile::Open.
La segunda sobrecarga actúa igual que si hubiera utilizado el primer constructor y llamado inmediatamente a Attach con los mismos parámetros. Para obtener información detallada, vea Attach
.
Ejemplo
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
Llame a esta función para obtener un puntero al bloque de memoria que va a utilizar CMemFile
.
BYTE* Detach();
Valor devuelto
Puntero al bloque de memoria con el contenido del archivo de memoria.
Comentarios
Al llamar a esta función, también se cierra CMemFile
. Puede volver a adjuntar el bloque de memoria a CMemFile
mediante una llamada a Attach. Si desea volver a adjuntar el archivo y usar los datos que hay en él, debe llamar a CFile::GetLength para obtener la longitud del archivo antes de llamar a Detach
. Si asocia un bloque de memoria a CMemFile
para poder usar sus datos (nGrowBytes
== 0), no puede aumentar el tamaño del archivo de memoria.
CMemFile::Free
Las funciones miembro de CMemFile
llaman a esta función.
virtual void Free(BYTE* lpMem);
Parámetros
lpMem
Puntero a la memoria que se va a desasignar.
Comentarios
Invalide esta función para implementar la desasignación de memoria personalizada. Si invalida esta función, probablemente también querrá invalidar Alloc y Realloc.
CMemFile::GetBufferPtr
Obtener o escribir en el búfer de memoria que respalda un archivo de memoria.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parámetros
nCommand
Comando bufferCommand que se va a llevar a cabo (bufferCheck
, bufferCommit
, bufferRead
o bufferWrite
).
nCount
En función de nCommand, el número de bytes del búfer que se va a leer, escribir o confirmar. Al leer desde el búfer, especifique -1 para devolver un búfer desde la posición actual hasta el final del archivo.
ppBufStart
[out] Inicio del búfer. Debe ser NULL
cuando nCommand es bufferCommit
.
ppBufMax
[out] Fin del búfer. Debe ser NULL
cuando nCommand es bufferCommit
.
Valor devuelto
Valor del comando | Valor devuelto |
---|---|
buffercheck |
Devuelve bufferDirect si se admite el almacenamiento en búfer directo; de lo contrario, 0. |
bufferCommit |
Devuelve 0 |
bufferRead o bufferWrite |
Devuelve el número de bytes del espacio de búfer devuelto. ppBufStart y ppBufMax apuntan al inicio y al final del búfer leído o escrito. |
Comentarios
La posición actual en el búfer de memoria (m_nPosition
) avanza de las siguientes maneras, en función de nCommand:
nCommand | Posición en el búfer |
---|---|
bufferCommit |
La posición actual avanza según el tamaño del búfer confirmado. |
bufferRead |
La posición actual avanza según el tamaño del búfer leído. |
CMemFile::GrowFile
Varias de las funciones miembro de CMemFile
llaman a esta función.
virtual void GrowFile(SIZE_T dwNewLen);
Parámetros
dwNewLen
Nuevo tamaño del archivo de memoria.
Comentarios
Puede invalidarlo si desea cambiar cómo aumenta CMemFile
el tamaño de su archivo. La implementación predeterminada llama a Realloc para aumentar un bloque existente (o a Alloc para crear un bloque de memoria), asignando memoria en múltiplos del valor nGrowBytes
especificado en el constructor o la llamada a Attach.
CMemFile::Memcpy
Las invalidaciones de CFile::Read y CFile::Write de CMemFile
llaman a esta función para transferir datos hacia y desde el archivo de memoria.
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
Parámetros
lpMemTarget
Puntero al bloque de memoria en el que se va a copiar la memoria de origen.
lpMemSource
Puntero al bloque de memoria de origen.
nBytes
Número de bytes que se van a copiar.
Valor devuelto
Una copia de lpMemTarget.
Comentarios
Invalide esta función si desea cambiar la forma en la que CMemFile
realiza estas copias de memoria.
CMemFile::Realloc
Las funciones miembro de CMemFile
llaman a esta función.
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
Parámetros
lpMem
Puntero al bloque de memoria que se va a reasignar.
nBytes
Nuevo tamaño del bloque de memoria.
Valor devuelto
Puntero al bloque de memoria que se ha reasignado (y posiblemente movido) o NULL si se produjo un error en la reasignación.
Comentarios
Invalide esta función para implementar la reasignación de memoria personalizada. Si invalida esta función, probablemente también querrá invalidar Alloc y Free.