Partilhar via


Classe CMemFile

A classe derivada de CFile que dá suporte a arquivos de memória.

Sintaxe

class CMemFile : public CFile

Membros

Construtores públicos

Nome Descrição
CMemFile::CMemFile Constrói um objeto de arquivo de memória.

Métodos públicos

Nome Descrição
CMemFile::Attach Anexa um bloco de memória a CMemFile.
CMemFile::Detach Desanexa o bloco de memória de CMemFile e retorna um ponteiro para o bloco de memória desanexado.
CMemFile::GetBufferPtr Obtém o buffer de memória que faz backup de um arquivo de memória, ou grava nele.

Métodos protegidos

Nome Descrição
CMemFile::Alloc Substitui para modificar o comportamento de alocação de memória.
CMemFile::Free Substitui para modificar o comportamento de desalocação de memória.
CMemFile::GrowFile Substitui para modificar o comportamento ao aumentar um arquivo.
CMemFile::Memcpy Substitui para modificar o comportamento de cópia de memória ao ler e gravar arquivos.
CMemFile::Realloc Substitui para modificar o comportamento de realocação de memória.

Comentários

Esses arquivos de memória se comportam como arquivos de disco, exceto que o arquivo é armazenado em RAM e não em disco. Um arquivo de memória é útil para:

  • armazenamento temporário
  • transferir bytes brutos entre processos independentes
  • transferir objetos serializados entre processos independentes

Os objetos CMemFile podem alocar automaticamente sua própria memória. Ou você pode anexar seu próprio bloco de memória ao objeto CMemFile chamando Attach. Em ambos os casos, a memória para aumentar o arquivo de memória automaticamente é alocada em incrementos dimensionados para nGrowBytes se nGrowBytes não for zero.

O bloco de memória será automaticamente excluído após a destruição do objeto CMemFile se a memória foi originalmente alocada pelo objeto CMemFile; caso contrário, você será responsável por desalocar a memória anexada ao objeto.

Você pode acessar o bloco de memória por meio do ponteiro fornecido ao desanexá-lo do objeto CMemFile chamando Detach.

O uso mais comum de CMemFile é criar um objeto CMemFile e usá-lo chamando as funções de membro CFile. A criação de um CMemFile o abre automaticamente: você não chama CFile::Open, que é usado apenas para arquivos de disco. Como CMemFile não usa um arquivo de disco, o membro de dados CFile::m_hFile não é usado.

As funções membro CFile Duplicate, LockRange e UnlockRange não são implementadas para CMemFile. Se você chamar essas funções em um objeto CMemFile, obterá um CNotSupportedException.

CMemFile usa as funções de biblioteca em tempo de execução malloc, realloc e free para alocar, realocar e desalocar memória; e o memcpy intrínseco para bloquear a memória de cópia ao ler e gravar. Se você quiser alterar esse comportamento ou o comportamento quando CMemFile aumentar um arquivo, derive sua própria classe de CMemFile e substitua as funções apropriadas.

Para obter mais informações sobre CMemFile, consulte os artigos Arquivos no MFC e Gerenciamento de Memória (MFC) e consulte Tratamento de Arquivos em Referência de Biblioteca em Tempo de Execução.

Hierarquia de herança

CObject

CFile

CMemFile

Requisitos

Cabeçalho: afx.h

CMemFile::Alloc

Essa função é chamada pelas funções membro CMemFile.

virtual BYTE* Alloc(SIZE_T nBytes);

Parâmetros

nBytes
O número de bytes da memória a ser alocada.

Valor de retorno

Um ponteiro para o bloco de memória alocado ou NULL se a operação tiver falhado.

Comentários

Substitua essa função para implementar a alocação de memória personalizada. Se você substituir essa função, provavelmente também desejará substituir Free e Realloc.

A implementação padrão usa a função de biblioteca em tempo de execução malloc para alocar memória.

CMemFile::Attach

Chame essa função para anexar um bloco de memória a CMemFile.

void Attach(
    BYTE* lpBuffer,
    UINT nBufferSize,
    UINT nGrowBytes = 0);

Parâmetros

lpBuffer
Ponteiro para o buffer a ser anexado a CMemFile.

nBufferSize
Um inteiro que especifica o tamanho do buffer em bytes.

nGrowBytes
O incremento de alocação de memória em bytes.

Comentários

Isso faz com que CMemFile use o bloco de memória como o arquivo de memória.

Se nGrowBytes for 0, CMemFile definirá o comprimento do arquivo como nBufferSize. Isso significa que os dados no bloco de memória antes de serem anexados a CMemFile serão usados como o arquivo. Os arquivos de memória criados dessa maneira não podem ser aumentados.

Como o arquivo não pode ser aumentado, tenha cuidado para não causar CMemFile na tentativa de aumentar o arquivo. Por exemplo, não chame as substituições CMemFile de CFile:Write para gravar após o final ou não chame CFile:SetLength com um comprimento maior que nBufferSize.

Se nGrowBytes for maior que 0, CMemFile ignorará o conteúdo do bloco de memória anexado. Você precisará gravar o conteúdo do arquivo de memória do zero usando a substituição CMemFile de CFile::Write. Se você tentar gravar depois do final do arquivo ou aumentar o arquivo chamando a substituição CMemFile de CFile::SetLength, CMemFile aumentará a alocação de memória em incrementos de nGrowBytes. O aumento da alocação de memória falhará se o bloco de memória passado para Attach não for alocado com um método compatível com Alloc. Para ser compatível com a implementação padrão de Alloc, você deve alocar a memória com a função de biblioteca em tempo de execução malloc ou calloc.

CMemFile::CMemFile

A primeira sobrecarga abre um arquivo de memória vazio.

CMemFile(UINT nGrowBytes = 1024);

CMemFile(
    BYTE* lpBuffer,
    UINT nBufferSize,
    UINT nGrowBytes = 0);

Parâmetros

nGrowBytes
O incremento de alocação de memória em bytes.

lpbuffer Ponteiro para um buffer que recebe informações do tamanho nBufferSize.

nBufferSize
Um inteiro que especifica o tamanho do buffer do arquivo em bytes.

Comentários

O arquivo é aberto pelo construtor. Não chame CFile::Open.

A segunda sobrecarga atua da mesma forma como se você usasse o primeiro construtor e chamasse imediatamente Attach com os mesmos parâmetros. Confira Attach para obter detalhes.

Exemplo

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

Chame essa função para obter um ponteiro para o bloco de memória que está sendo usado por CMemFile.

BYTE* Detach();

Valor de retorno

Um ponteiro para o bloco de memória que contém o conteúdo do arquivo de memória.

Comentários

Chamar essa função também fecha o CMemFile. Você pode anexar novamente o bloco de memória a CMemFile chamando Attach. Se você quiser realocar o arquivo e usar os dados nele, chame CFile::GetLength para obter o comprimento do arquivo antes de chamar Detach. Se você anexar um bloco de memória a CMemFile para que possa usar seus dados ( nGrowBytes == 0), não poderá aumentar o arquivo de memória.

CMemFile::Free

Essa função é chamada pelas funções membro CMemFile.

virtual void Free(BYTE* lpMem);

Parâmetros

lpMem
Ponteiro para a memória a ser desalocada.

Comentários

Substitua essa função para implementar a desalocação de memória personalizada. Se você substituir essa função, provavelmente também desejará substituir Alloc e Realloc.

CMemFile::GetBufferPtr

Obtém o buffer de memória que faz backup de um arquivo de memória, ou grava nele.

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

Parâmetros

nCommand
O bufferCommand a ser realizado (bufferCheck, bufferCommit, bufferRead ou bufferWrite ).

nCount
Dependendo do nCommand, o número de bytes no buffer para ler, gravar ou confirmar. Ao ler do buffer, especifique -1 para voltar um buffer da posição atual para o final do arquivo.

ppBufStart
[out] O início do buffer. Deve ser NULL quando nCommand for bufferCommit.

ppBufMax
[out] O final do buffer. Deve ser NULL quando nCommand for bufferCommit.

Valor de retorno

Valor do comando Valor retornado
buffercheck Retorna bufferDirect se houver suporte para buffers diretos, caso contrário, 0.
bufferCommit Retorna 0
bufferRead ou bufferWrite Retorna o número de bytes no espaço de buffer retornado. ppBufStart e ppBufMax apontam para o início e o fim do buffer de leitura/gravação.

Comentários

A posição atual no buffer de memória (m_nPosition) é avançada das seguintes maneiras, dependendo do nCommand:

nCommand posição do buffer
bufferCommit A posição atual avança pelo tamanho do buffer confirmado.
bufferRead A posição atual avança pelo tamanho do buffer lido.

CMemFile::GrowFile

Essa função é chamada por várias das funções membro CMemFile.

virtual void GrowFile(SIZE_T dwNewLen);

Parâmetros

dwNewLen
Tamanho novo da memória bruta.

Comentários

Você pode substituí-lo se quiser alterar como CMemFile aumenta seu arquivo. A implementação padrão chama Realloc para aumentar um bloco existente (ou Alloc para criar um bloco de memória), alocando memória em múltiplos do valor nGrowBytes especificado no construtor ou na chamada Attach.

CMemFile::Memcpy

Essa função é chamada pelas substituições CMemFile de CFile::Read e CFile::Write para transferir dados de e para o arquivo de memória.

virtual BYTE* Memcpy(
    BYTE* lpMemTarget,
    const BYTE* lpMemSource,
    SIZE_T nBytes);

Parâmetros

lpMemTarget
Ponteiro para o bloco de memória no qual a memória de origem será copiada.

lpMemSource
Ponteiro para o bloco de memória de origem.

nBytes
Número de bytes a serem copiados.

Valor de retorno

Uma cópia de lpMemTarget.

Comentários

Substitua essa função se você quiser alterar a maneira como CMemFile faz essas cópias de memória.

CMemFile::Realloc

Essa função é chamada pelas funções membro CMemFile.

virtual BYTE* Realloc(
    BYTE* lpMem,
    SIZE_T nBytes);

Parâmetros

lpMem
Um ponteiro para o bloco de memória a ser realocado.

nBytes
Novo tamanho para o bloco de memória.

Valor de retorno

Um ponteiro para o bloco de memória que foi realocado (e possivelmente movido) ou NULL se a realocação falhou.

Comentários

Substitua essa função para implementar a realocação de memória personalizada. Se você substituir essa função, provavelmente também desejará substituir Alloc e Free.

Confira também

Classe CFile
Gráfico da hierarquia