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
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.