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

CObject

CFile

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.

Consulte también

CFile (clase)
Gráfico de jerarquías