Klasa CMemFile

Klasa pochodna CFile, która obsługuje pliki pamięci.

Składnia

class CMemFile : public CFile

Członkowie

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 CMemFileprogramu .
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 nGrowBytesprzyrostach 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 CFileskł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 CMemFiletemat 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

Cobject

Cfile

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

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

Parametry

lpBuffer
Wskaźnik do buforu, który ma zostać dołączony do CMemFileelementu .

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::SetLengthelementu , 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ą Allocprogramu , 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 CMemFileprogram .

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 .

Zobacz też

Klasa CFile
Wykres hierarchii