Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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::D etach | 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 CFile, LockRange y UnlockRange de 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 CMemFile invalidaciones de CFile::Write para escribir más allá del final o no 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 CMemFile de CFile::Write. Si intenta escribir después del final del archivo o aumentar el tamaño del archivo llamando a la invalidación de CMemFile de CFile::SetLength, 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 del tamaño 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::D etach
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 que pueda usar sus datos (nGrowBytes == 0), no podrá aumentar el 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
BufferCommand que se va a llevar a cabo (bufferCheck, bufferCommit, bufferReado 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 CMemFile y CFile::Write de 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.