Klasa CMemFile
Klasa pochodna CFile, która obsługuje pliki pamięci.
Składnia
class CMemFile : public CFile
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CMemFile::CMemFile | Tworzy obiekt pliku pamięci. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CMemFile::Attach | Dołącza blok pamięci do CMemFile programu . |
CMemFile::D etach | Odłącza blok pamięci od CMemFile i zwraca wskaźnik do bloku pamięci odłączonej. |
CMemFile::GetBufferPtr | Pobierz lub zapisz w buforze pamięci, który jest kopią zapasową pliku pamięci. |
Metody chronione
Nazwa/nazwisko | opis |
---|---|
CMemFile::Alloc | Zastąpić, aby zmodyfikować zachowanie alokacji pamięci. |
CMemFile::Free | Zastąpić, aby zmodyfikować zachowanie cofania przydziału pamięci. |
CMemFile::GrowFile | Zastąpij, aby zmodyfikować zachowanie podczas zwiększania pliku. |
CMemFile::Memcpy | Zastąpij, aby zmodyfikować zachowanie kopiowania pamięci podczas odczytywania i zapisywania plików. |
CMemFile::Realloc | Zastąpij, aby zmodyfikować zachowanie reallokacji pamięci. |
Uwagi
Te pliki pamięci zachowują się jak pliki dysku, z wyjątkiem pliku są przechowywane w pamięci RAM, a nie na dysku. Plik pamięci jest przydatny w następujących celach:
- szybki magazyn tymczasowy
- transferowanie nieprzetworzonych bajtów między niezależnymi procesami
- transferowanie serializowanych obiektów między niezależnymi procesami
CMemFile
obiekty mogą automatycznie przydzielać własną pamięć. Możesz też dołączyć własny blok pamięci do CMemFile
obiektu, wywołując funkcję Attach. W obu przypadkach pamięć do automatycznego zwiększania pliku pamięci jest przydzielana w nGrowBytes
przyrostach o rozmiarze, jeśli nGrowBytes
nie jest równa zero.
Blok pamięci zostanie automatycznie usunięty po usunięciu CMemFile
obiektu, jeśli pamięć została pierwotnie przydzielona przez CMemFile
obiekt. W przeciwnym razie ponosisz odpowiedzialność za cofnięcie przydziału pamięci dołączonej do obiektu.
Dostęp do bloku pamięci można uzyskać za pośrednictwem wskaźnika dostarczonego podczas odłączania go od CMemFile
obiektu, wywołując polecenie Detach.
Najczęstszym zastosowaniem metody CMemFile
jest utworzenie obiektu i użycie go przez wywołanie funkcji składowych CFile.CMemFile
Utworzenie automatycznie CMemFile
go otwiera: nie wywołujesz pliku CFile::Open, który jest używany tylko dla plików dysków. Ponieważ CMemFile
nie używa pliku dysku, element członkowski CFile::m_hFile
danych nie jest używany.
Funkcje CFile
składowe Duplicate, LockRange i UnlockRange nie są implementowane dla programu CMemFile
. Jeśli wywołasz te funkcje w CMemFile
obiekcie, otrzymasz wyjątek CNotSupportedException.
CMemFile
używa funkcji biblioteki w czasie wykonywania malloc, realloc i free do przydzielania, ponownego przydziału i cofania przydziału pamięci; oraz wewnętrznej memcpy do blokowania pamięci kopiowania podczas odczytywania i zapisywania. Jeśli chcesz zmienić to zachowanie lub zachowanie podczas CMemFile
powiększania pliku, utwórz własną klasę z CMemFile
i przesłoń odpowiednie funkcje.
Aby uzyskać więcej informacji na CMemFile
temat programu , zobacz artykuły Pliki w MFC i zarządzanie pamięcią (MFC) i zobacz Obsługa plików w dokumentacji biblioteki czasu wykonywania.
Hierarchia dziedziczenia
CMemFile
Wymagania
Nagłówek: afx.h
CMemFile::Alloc
Ta funkcja jest wywoływana przez CMemFile
funkcje składowe.
virtual BYTE* Alloc(SIZE_T nBytes);
Parametry
nBajty
Liczba bajtów pamięci do przydzielenia.
Wartość zwracana
Wskaźnik do przydzielonego bloku pamięci lub wartość NULL, jeśli alokacja nie powiodła się.
Uwagi
Zastąpi tę funkcję, aby zaimplementować niestandardową alokację pamięci. Jeśli zastąpisz tę funkcję, prawdopodobnie chcesz również zastąpić funkcję Free i Realloc .
Domyślna implementacja używa malloc funkcji biblioteki czasu wykonywania do przydzielania pamięci.
CMemFile::Attach
Wywołaj tę funkcję, aby dołączyć blok pamięci do CMemFile
elementu .
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametry
lpBuffer
Wskaźnik do buforu, który ma zostać dołączony do CMemFile
elementu .
nBufferSize
Liczba całkowita określająca rozmiar buforu w bajtach.
nGrowBytes
Alokacja pamięci zwiększa się w bajtach.
Uwagi
CMemFile
Powoduje to użycie bloku pamięci jako pliku pamięci.
Jeśli parametr nGrowBytes ma wartość 0, CMemFile
ustawi długość pliku na nBufferSize. Oznacza to, że dane w bloku pamięci przed ich dołączeniu CMemFile
będą używane jako plik. Pliki pamięci utworzone w ten sposób nie mogą być uprawiane.
Ponieważ nie można rozwinąć pliku, należy uważać, aby nie powodować CMemFile
próby zwiększenia pliku. Na przykład nie należy wywoływać przesłonięć pliku CFile:Write w celu zapisania w końcu lub nie wywołaj CMemFile
metody CFile:SetLength o długości dłuższej niż nBufferSize.
Jeśli liczba nGrowBytes jest większa niż 0, CMemFile
zignoruje zawartość dołączonego bloku pamięci. Musisz zapisać zawartość pliku pamięci od podstaw przy użyciu CMemFile
przesłonięcia CFile::Write
. Jeśli spróbujesz zapisać obok końca pliku lub zwiększysz rozmiar pliku przez wywołanie CMemFile
przesłonięcia CFile::SetLength
elementu , CMemFile
zwiększy alokację pamięci w przyrostach nGrowBytes. Zwiększanie alokacji pamięci zakończy się niepowodzeniem, jeśli przekazany blok Attach
pamięci nie został przydzielony z metodą zgodną z alloc. Aby zapewnić zgodność z domyślną implementacją Alloc
programu , należy przydzielić pamięć z malloc lub calloc funkcji biblioteki czasu wykonywania.
CMemFile::CMemFile
Pierwsze przeciążenie otwiera pusty plik pamięci.
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametry
nGrowBytes
Alokacja pamięci zwiększa się w bajtach.
Wskaźnik lpBuffer do buforu, który odbiera informacje o rozmiarze nBufferSize.
nBufferSize
Liczba całkowita określająca rozmiar buforu pliku w bajtach.
Uwagi
Plik jest otwierany przez konstruktor. Nie należy wywoływać pliku CFile::Open.
Drugie przeciążenie działa tak samo, jak w przypadku użycia pierwszego konstruktora i natychmiastowego wywołania funkcji Attach z tymi samymi parametrami. Zobacz Attach
, aby uzyskać szczegółowe informacje.
Przykład
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
Wywołaj tę funkcję, aby uzyskać wskaźnik do bloku pamięci używanego przez CMemFile
program .
BYTE* Detach();
Wartość zwracana
Wskaźnik do bloku pamięci, który zawiera zawartość pliku pamięci.
Uwagi
Wywołanie tej funkcji powoduje również zamknięcie obiektu CMemFile
. Blok pamięci można ponownie dołączyć, CMemFile
wywołując funkcję Attach. Jeśli chcesz ponownie dołączyć plik i użyć w nim danych, należy wywołać metodę CFile::GetLength , aby uzyskać długość pliku przed wywołaniem metody Detach
. Jeśli dołączysz blok pamięci, aby CMemFile
można było użyć jego danych ( nGrowBytes
== 0), nie będzie można zwiększyć pliku pamięci.
CMemFile::Free
Ta funkcja jest wywoływana przez CMemFile
funkcje składowe.
virtual void Free(BYTE* lpMem);
Parametry
lpMem
Wskaźnik do pamięci, który ma zostać cofnięty.
Uwagi
Zastąpi tę funkcję, aby zaimplementować niestandardową alokację pamięci. Jeśli zastąpisz tę funkcję, prawdopodobnie warto zastąpić również alloc i realloc .
CMemFile::GetBufferPtr
Pobierz lub zapisz w buforze pamięci, który jest kopią zapasową pliku pamięci.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parametry
nPolecenia
BufferCommand do wykonania (bufferCheck
, bufferCommit
, bufferRead
, lub bufferWrite
).
nCount
W zależności od polecenia nPolecenia liczba bajtów w buforze do odczytu, zapisu lub zatwierdzania. Podczas odczytywania z buforu określ -1, aby zwrócić bufor z bieżącej pozycji na końcu pliku.
ppBufStart
[out] Początek buforu. Musi być NULL
, gdy nPolecenia ma wartość bufferCommit
.
ppBufMax
[out] Koniec buforu. Musi być NULL
, gdy nPolecenia ma wartość bufferCommit
.
Wartość zwracana
wartość polecenia | Wartość zwracana |
---|---|
buffercheck |
Zwraca wartość bufferDirect , jeśli jest obsługiwane buforowanie bezpośrednie, w przeciwnym razie 0. |
bufferCommit |
Zwraca 0 |
bufferRead lub bufferWrite |
Zwraca liczbę bajtów w zwracanym obszarze buforu. ppBufStart i ppBufMax wskazują początek i koniec buforu odczytu/zapisu. |
Uwagi
Bieżące położenie w buforze pamięci (m_nPosition
) jest zaawansowane w następujący sposób, w zależności od nPolecenia:
nPolecenia | położenie buforu |
---|---|
bufferCommit |
Bieżąca pozycja jest zwiększana o rozmiar zatwierdzonego buforu. |
bufferRead |
Bieżąca pozycja zwiększa się o rozmiar buforu odczytu. |
CMemFile::GrowFile
Ta funkcja jest wywoływana przez kilka funkcji składowych CMemFile
.
virtual void GrowFile(SIZE_T dwNewLen);
Parametry
dwNewLen
Nowy rozmiar pliku pamięci.
Uwagi
Możesz go zastąpić, jeśli chcesz zmienić sposób CMemFile
jego rozwoju. Domyślna implementacja wywołuje metodę Realloc , aby zwiększyć istniejący blok (lub Alloc w celu utworzenia bloku pamięci), przydzielając pamięć w wielokrotnościach nGrowBytes
wartości określonej w konstruktorze lub wywołaniu Dołącz .
CMemFile::Memcpy
Ta funkcja jest wywoływana przez CMemFile
przesłonięcia CFile::Read i CFile::Write w celu transferu danych do i z pliku pamięci.
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
Parametry
lpMemTarget
Wskaźnik do bloku pamięci, do którego zostanie skopiowana pamięć źródłowa.
lpMemSource
Wskaźnik do bloku pamięci źródłowej.
nBajty
Liczba bajtów do skopiowania.
Wartość zwracana
Kopia obiektu lpMemTarget.
Uwagi
Zastąpi tę funkcję, jeśli chcesz zmienić sposób kopiowania CMemFile
pamięci.
CMemFile::Realloc
Ta funkcja jest wywoływana przez CMemFile
funkcje składowe.
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
Parametry
lpMem
Wskaźnik do bloku pamięci, który ma zostać przeniesiony.
nBajty
Nowy rozmiar bloku pamięci.
Wartość zwracana
Wskaźnik do bloku pamięci, który został przeniesiony (i prawdopodobnie przeniesiony) lub NULL, jeśli lokalizacja rzeczywista nie powiodła się.
Uwagi
Zastąpi tę funkcję, aby zaimplementować niestandardową alokację pamięci. Jeśli zastąpisz tę funkcję, prawdopodobnie zechcesz również zastąpić alloc i Free .