Classe CMemFile
Classe derivata da CFile che supporta i file di memoria.
Sintassi
class CMemFile : public CFile
Membri
Costruttori pubblici
Nome | Descrizione |
---|---|
CMemFile::CMemFile | Costruisce un oggetto file di memoria. |
Metodi pubblici
Nome | Descrizione |
---|---|
CMemFile::Attach | Collega un blocco di memoria a CMemFile . |
CMemFile::D etach | Scollega il blocco di memoria da CMemFile e restituisce un puntatore al blocco di memoria scollegato. |
CMemFile::GetBufferPtr | Ottenere o scrivere nel buffer di memoria che esegue il backup di un file di memoria. |
Metodi protetti
Nome | Descrizione |
---|---|
CMemFile::Alloc | Eseguire l'override per modificare il comportamento di allocazione della memoria. |
CMemFile::Free | Eseguire l'override per modificare il comportamento di deallocazione della memoria. |
CMemFile::GrowFile | Eseguire l'override per modificare il comportamento durante l'aumento di un file. |
CMemFile::Memcpy | Eseguire l'override per modificare il comportamento di copia della memoria durante la lettura e la scrittura di file. |
CMemFile::Realloc | Eseguire l'override per modificare il comportamento di riallocazione della memoria. |
Osservazioni:
Questi file di memoria si comportano come file su disco, ad eccezione del file archiviato in RAM anziché su disco. Un file di memoria è utile per:
- archiviazione temporanea veloce
- trasferimento di byte non elaborati tra processi indipendenti
- trasferimento di oggetti serializzati tra processi indipendenti
CMemFile
gli oggetti possono allocare automaticamente la propria memoria. In alternativa, è possibile collegare il proprio blocco di memoria all'oggetto CMemFile
chiamando Attach. In entrambi i casi, la memoria per l'aumento automatico del file di memoria viene allocata in incrementi di nGrowBytes
dimensioni se nGrowBytes
non è zero.
Il blocco di memoria verrà eliminato automaticamente in caso di distruzione dell'oggetto CMemFile
se la memoria è stata originariamente allocata dall'oggetto CMemFile
. In caso contrario, si è responsabili della deallocazione della memoria associata all'oggetto.
È possibile accedere al blocco di memoria tramite il puntatore fornito quando lo si scollega dall'oggetto CMemFile
chiamando Detach.
L'uso più comune di CMemFile
consiste nel creare un CMemFile
oggetto e usarlo chiamando le funzioni membro CFile . La creazione di un CMemFile
oggetto viene aperta automaticamente: non si chiama CFile::Open, che viene usata solo per i file su disco. Poiché CMemFile
non usa un file su disco, il membro CFile::m_hFile
dati non viene usato.
Le CFile
funzioni membro Duplicate, LockRange e UnlockRange non vengono implementate per CMemFile
. Se si chiamano queste funzioni su un CMemFile
oggetto, si otterrà un'eccezione CNotSupportedException.
CMemFile
usa le funzioni della libreria di runtime malloc, realloc e free per allocare, riallocare e deallocare memoria e il memcpy intrinseco per bloccare la memoria di copia durante la lettura e la scrittura. Se si vuole modificare questo comportamento o il comportamento in caso CMemFile
di crescita di un file, derivare la propria classe da CMemFile
ed eseguire l'override delle funzioni appropriate.
Per altre informazioni su CMemFile
, vedere gli articoli File in MFC e Gestione della memoria (MFC) e vedere Gestione dei file nelle informazioni di riferimento sulla libreria di runtime.
Gerarchia di ereditarietà
CMemFile
Requisiti
Intestazione: afx.h
CMemFile::Alloc
Questa funzione viene chiamata dalle CMemFile
funzioni membro.
virtual BYTE* Alloc(SIZE_T nBytes);
Parametri
nBytes
Numero di byte di memoria da allocare.
Valore restituito
Puntatore al blocco di memoria allocato o NULL se l'allocazione non è riuscita.
Osservazioni:
Eseguire l'override di questa funzione per implementare l'allocazione di memoria personalizzata. Se si esegue l'override di questa funzione, è probabile che si voglia eseguire l'override anche di Free e Realloc .
L'implementazione predefinita usa la funzione della libreria di runtime malloc per allocare memoria.
CMemFile::Attach
Chiamare questa funzione per collegare un blocco di memoria a CMemFile
.
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametri
lpBuffer
Puntatore al buffer da collegare a CMemFile
.
nBufferSize
Intero che specifica le dimensioni del buffer in byte.
nGrowBytes
Incremento dell'allocazione di memoria in byte.
Osservazioni:
Ciò comporta CMemFile
l'uso del blocco di memoria come file di memoria.
Se nGrowBytes è 0, CMemFile
imposta la lunghezza del file su nBufferSize. Ciò significa che i dati nel blocco di memoria prima che siano stati collegati a CMemFile
verranno usati come file. I file di memoria creati in questo modo non possono essere cresciuti.
Poiché il file non può essere cresciuto, prestare attenzione a non fare in modo CMemFile
che si tenti di aumentare il file. Ad esempio, non chiamare gli CMemFile
override di CFile:Write per scrivere oltre la fine o non chiamare CFile:SetLength con lunghezza superiore a nBufferSize.
Se nGrowBytes è maggiore di 0, CMemFile
ignorerà il contenuto del blocco di memoria associato. Sarà necessario scrivere il contenuto del file di memoria da zero usando l'override CMemFile
di CFile::Write
. Se si tenta di scrivere oltre la fine del file o aumentare il file chiamando l'override di CFile::SetLength
, l'allocazione CMemFile
di memoria aumenta in incrementi di nGrowBytesCMemFile
. La crescita dell'allocazione di memoria avrà esito negativo se il blocco di memoria passato a Attach
non è stato allocato con un metodo compatibile con Alloc. Per essere compatibile con l'implementazione predefinita di Alloc
, è necessario allocare la memoria con la funzione della libreria di runtime malloc o calloc.
CMemFile::CMemFile
Il primo overload apre un file di memoria vuoto.
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametri
nGrowBytes
Incremento dell'allocazione di memoria in byte.
Puntatore lpBuffer a un buffer che riceve informazioni sulle dimensioni nBufferSize.
nBufferSize
Intero che specifica le dimensioni del buffer del file, in byte.
Osservazioni:
Il file viene aperto dal costruttore . Non chiamare CFile::Open.
Il secondo overload funziona come se fosse stato usato il primo costruttore e immediatamente chiamato Attach con gli stessi parametri. Per informazioni dettagliate, vedere Attach
.
Esempio
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
Chiamare questa funzione per ottenere un puntatore al blocco di memoria usato da CMemFile
.
BYTE* Detach();
Valore restituito
Puntatore al blocco di memoria che contiene il contenuto del file di memoria.
Osservazioni:
La chiamata a questa funzione chiude anche .CMemFile
È possibile ricollegare il blocco di memoria a chiamando Attach.You can reattach the memory block to CMemFile
by calling Attach. Se si vuole ricollegare il file e usarli, è necessario chiamare CFile::GetLength per ottenere la lunghezza del file prima di chiamare .Detach
Se si collega un blocco di memoria a CMemFile
in modo che sia possibile usare i relativi dati ( nGrowBytes
== 0), non è possibile aumentare il file di memoria.
CMemFile::Free
Questa funzione viene chiamata dalle CMemFile
funzioni membro.
virtual void Free(BYTE* lpMem);
Parametri
lpMem
Puntatore alla memoria da deallocare.
Osservazioni:
Eseguire l'override di questa funzione per implementare la deallocazione della memoria personalizzata. Se si esegue l'override di questa funzione, è probabile che si voglia eseguire anche l'override di Alloc e Realloc .
CMemFile::GetBufferPtr
Ottenere o scrivere nel buffer di memoria che esegue il backup di un file di memoria.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parametri
nCommand
BufferCommand da eseguire (bufferCheck
, bufferCommit
, bufferRead
o bufferWrite
).
nCount
A seconda di nCommand, il numero di byte nel buffer da leggere, scrivere o eseguire il commit. Quando si legge dal buffer, specificare -1 per restituire un buffer dalla posizione corrente alla fine del file.
ppBufStart
[out] Inizio del buffer. Deve essere NULL
quando nCommand è bufferCommit
.
ppBufMax
[out] Fine del buffer. Deve essere NULL
quando nCommand è bufferCommit
.
Valore restituito
valore del comando | Valore restituito |
---|---|
buffercheck |
Restituisce bufferDirect se il buffer diretto è supportato; in caso contrario, 0. |
bufferCommit |
Restituisce 0 . |
bufferRead oppure bufferWrite |
Restituisce il numero di byte nello spazio buffer restituito. ppBufStart e ppBufMax puntano all'inizio e alla fine del buffer di lettura/scrittura. |
Osservazioni:
La posizione corrente nel buffer di memoria (m_nPosition
) è avanzata nei modi seguenti, a seconda di nCommand:
nCommand | posizione buffer |
---|---|
bufferCommit |
La posizione corrente avanza in base alle dimensioni del buffer di cui è stato eseguito il commit. |
bufferRead |
La posizione corrente avanza in base alle dimensioni del buffer di lettura. |
CMemFile::GrowFile
Questa funzione viene chiamata da diverse funzioni CMemFile
membro.
virtual void GrowFile(SIZE_T dwNewLen);
Parametri
dwNewLen
Nuove dimensioni del file di memoria.
Osservazioni:
È possibile eseguirne l'override se si vuole modificare la CMemFile
modalità di crescita del file. L'implementazione predefinita chiama Realloc per aumentare un blocco esistente (o Alloc per creare un blocco di memoria), allocando memoria in multipli del nGrowBytes
valore specificato nel costruttore o nella chiamata Attach .
CMemFile::Memcpy
Questa funzione viene chiamata dagli CMemFile
override di CFile::Read e CFile::Write per trasferire i dati da e verso il file di memoria.
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
Parametri
lpMemTarget
Puntatore al blocco di memoria in cui verrà copiata la memoria di origine.
lpMemSource
Puntatore al blocco di memoria di origine.
nBytes
Numero di byte da copiare.
Valore restituito
Copia di lpMemTarget.
Osservazioni:
Eseguire l'override di questa funzione se si vuole modificare il modo in cui CMemFile
vengono copiate queste copie di memoria.
CMemFile::Realloc
Questa funzione viene chiamata dalle CMemFile
funzioni membro.
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
Parametri
lpMem
Puntatore al blocco di memoria da riallocare.
nBytes
Nuove dimensioni per il blocco di memoria.
Valore restituito
Puntatore al blocco di memoria riallocato (ed eventualmente spostato) o NULL se la riallocazione non è riuscita.
Osservazioni:
Eseguire l'override di questa funzione per implementare la riallocazione della memoria personalizzata. Se si esegue l'override di questa funzione, è probabile che si voglia eseguire anche l'override di Alloc e Free .