Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A classe derivada de CFile, que suporta 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::Anexar | Anexa um bloco de memória ao CMemFile. |
| CMemFile::D etach | Desanexa o bloco de memória e CMemFile retorna um ponteiro para o bloco de memória desanexado. |
| CMemFile::GetBufferPtr | Obtenha ou grave no buffer de memória que faz backup de um arquivo de memória. |
Métodos Protegidos
| Nome | Descrição |
|---|---|
| CMemFile::Alloc | Substituir para modificar o comportamento de alocação de memória. |
| CMemFile::Grátis | Substituir para modificar o comportamento de desalocação de memória. |
| CMemFile::GrowFile | Substituir para modificar o comportamento ao criar um arquivo. |
| CMemFile::Memcpy | Substituir para modificar o comportamento da cópia de memória ao ler e gravar arquivos. |
| CMemFile::Realloc | Substituir para modificar o comportamento de realocação de memória. |
Observações
Esses arquivos de memória se comportam como arquivos de disco, exceto que o arquivo é armazenado na RAM em vez de no disco. Um arquivo de memória é útil para:
- Armazenamento temporário rápido
- transferência de bytes brutos entre processos independentes
- Transferência de objetos serializados entre processos independentes
CMemFile Os objetos podem alocar automaticamente sua própria memória. Ou, você pode anexar seu próprio bloco de memória ao CMemFile objeto chamando Attach. Em ambos os casos, a memória para aumentar o arquivo de memória automaticamente é alocada em nGrowBytesincrementos de tamanho se nGrowBytes não for zero.
O bloco de memória será automaticamente excluído após a CMemFile destruição do objeto se a memória foi originalmente alocada pelo CMemFile objeto, caso contrário, você é responsável por deslocalizar a memória anexada ao objeto.
Você pode acessar o bloco de memória através do ponteiro fornecido quando o desanexa do CMemFile objeto chamando Desanexar.
O uso mais comum é CMemFile criar um CMemFile objeto e usá-lo chamando funções de membro CFile . Criar um CMemFile 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 CFile::m_hFile de dados não é usado.
As CFile funções de membro Duplicate, LockRange e UnlockRange não são implementadas para CMemFile. Se você chamar essas funções em um CMemFile objeto, obterá um CNotSupportedException.
CMemFile usa as funções de biblioteca de tempo de execução malloc, realloc e livre para alocar, realocar e desalocar memória; e o memcpy intrínseco para bloquear a memória de cópia ao ler e escrever. Se você quiser alterar esse comportamento ou o comportamento quando CMemFile um arquivo cresce, derive sua própria classe e CMemFile substitua as funções apropriadas.
Para obter mais informações sobre CMemFileo , consulte os artigos Arquivos no MFC e Gerenciamento de Memória (MFC) e consulte Tratamento de arquivos na Referência da bibliotecaRun-Time.
Hierarquia de herança
CMemFile
Requerimentos
Cabeçalho: afx.h
CMemFile::Alloc
Esta função é chamada por CMemFile funções de membro.
virtual BYTE* Alloc(SIZE_T nBytes);
Parâmetros
nBytes
Número de bytes de memória a alocar.
Valor de retorno
Um ponteiro para o bloco de memória que foi alocado ou NULL se a alocação falhou.
Observações
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 de tempo de execução malloc para alocar memória.
CMemFile::Anexar
Chame essa função para anexar um bloco de memória ao CMemFile.
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parâmetros
lpBuffer
Ponteiro para o buffer a ser anexado ao CMemFile.
nBufferSize
Um inteiro que especifica o tamanho do buffer em bytes.
nGrowBytes
O incremento de alocação de memória em bytes.
Observações
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 ser anexado CMemFile serão usados como o arquivo. Os ficheiros de memória criados desta forma não podem ser aumentados.
Como o arquivo não pode ser aumentado, tenha cuidado para não causar CMemFile a tentativa de aumentar o arquivo. Por exemplo, não chame as CMemFile substituições de CFile::Write para escrever 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ê terá que escrever o conteúdo do arquivo de memória do zero usando a CMemFile substituição de CFile::Write. Se você tentar gravar após o final do arquivo ou aumentar o arquivo chamando a CMemFile substituição de , CFile::SetLength aumentará a alocação de CMemFilememória em incrementos de nGrowBytes. O aumento da alocação de memória falhará se o bloco de memória para o Attach qual você passar não tiver sido alocado com um método compatível com o Alloc. Para ser compatível com a implementação padrão do , você deve alocar a memória com a função de biblioteca de Alloctempo 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 de arquivo, em bytes.
Observações
O arquivo é aberto pelo construtor. Não chame CFile::Open.
A segunda sobrecarga age da mesma forma como se você usasse o primeiro construtor e imediatamente chamado Attach com os mesmos parâmetros. Consulte 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::D etach
Chame essa função para obter um ponteiro para o bloco de memória que está sendo usado pelo 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.
Observações
Chamar essa função também fecha o CMemFile. Você pode reanexar o bloco de memória chamando CMemFileAttach. Se você quiser reanexar o arquivo e usar os dados nele, você deve chamar CFile::GetLength para obter o comprimento do arquivo antes de chamar Detach. Se você anexar um bloco de memória para CMemFile que você possa usar seus dados (nGrowBytes == 0), então você não pode aumentar o arquivo de memória.
CMemFile::Grátis
Esta função é chamada por CMemFile funções de membro.
virtual void Free(BYTE* lpMem);
Parâmetros
lpMem
Ponteiro para a memória a ser deslocalizada.
Observações
Substitua essa função para implementar a deslocalização de memória personalizada. Se você substituir essa função, provavelmente também desejará substituir Alloc e Realloc .
CMemFile::GetBufferPtr
Obtenha ou grave no buffer de memória que faz backup de um arquivo de memória.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parâmetros
nComando
O bufferCommand a ser executado (bufferCheck, bufferCommit, bufferRead, ou bufferWrite).
nContagem
Dependendo do nCommand, o número de bytes no buffer para ler, gravar ou confirmar. Ao ler a partir do buffer, especifique -1 para retornar um buffer da posição atual para o final do arquivo.
ppBufStart
[saídas] O início do buffer. Deve ser NULL quando nCommand é bufferCommit.
ppBufMax
[saídas] O fim do buffer. Deve ser NULL quando nCommand é bufferCommit.
Valor de retorno
| valor do comando | Valor de retorno |
|---|---|
buffercheck |
Retorna bufferDirect se o buffer direto for suportado, caso contrário, 0. |
bufferCommit |
Devoluções 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. |
Observações
A posição atual no buffer de memória (m_nPosition) é avançada das seguintes maneiras, dependendo do nCommand:
| nComando | posição tampão |
|---|---|
bufferCommit |
A posição atual avança pelo tamanho do buffer comprometido. |
bufferRead |
A posição atual avança pelo tamanho do buffer de leitura. |
CMemFile::GrowFile
Esta função é chamada por várias das CMemFile funções de membro.
virtual void GrowFile(SIZE_T dwNewLen);
Parâmetros
dwNewLen
Novo tamanho do arquivo de memória.
Observações
Você pode substituí-lo se quiser alterar a forma como CMemFile o arquivo cresce. 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 nGrowBytes valor especificado no construtor ou chamada Attach .
CMemFile::Memcpy
Esta função é chamada pelas CMemFile substituições 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.
Observações
Substitua essa função se você quiser alterar a maneira como CMemFile essas cópias de memória.
CMemFile::Realloc
Esta função é chamada por CMemFile funções de membro.
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 falhar.
Observações
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 .