Sdílet prostřednictvím


CMemFile – třída

CFile odvozená třída, která podporuje paměťové soubory.

Syntaxe

class CMemFile : public CFile

Členové

Veřejné konstruktory

Název Popis
CMemFile::CMemFile Vytvoří objekt souboru paměti.

Veřejné metody

Název Popis
CMemFile::Attach Připojí blok paměti k CMemFile.
CMemFile::D etach Odpojte blok paměti CMemFile a vrátí ukazatel na blok odpojené paměti.
CMemFile::GetBufferPtr Získejte nebo zapište do vyrovnávací paměti, která zálohuje soubor paměti.

Chráněné metody

Název Popis
CMemFile::Alloc Přepsání pro úpravu chování přidělení paměti.
CMemFile::Free Přepsání pro úpravu chování přidělení paměti.
CMemFile::GrowFile Přepište chování při rozšiřování souboru.
CMemFile::Memcpy Přepsání pro úpravu chování kopírování paměti při čtení a zápisu souborů
CMemFile::Realloc Přepsání pro úpravu chování skutečné polohy paměti.

Poznámky

Tyto soubory paměti se chovají jako diskové soubory s výjimkou souborů, které jsou uložené v paměti RAM, nikoli na disku. Soubor paměti je užitečný pro:

  • rychlé dočasné úložiště
  • přenos nezpracovaných bajtů mezi nezávislými procesy
  • přenos serializovaných objektů mezi nezávislými procesy

CMemFile objekty mohou automaticky přidělit vlastní paměť. Nebo můžete k objektu CMemFile připojit vlastní blok paměti voláním Připojit. V obou případech je paměť pro růst souboru paměti automaticky přidělena v nGrowBytespřírůstcích velikosti, pokud nGrowBytes není nula.

Blok paměti se automaticky odstraní po zničení objektu CMemFile , pokud byla paměť původně přidělena objektem CMemFile . V opačném případě zodpovídáte za uvolnění paměti, kterou jste připojili k objektu.

K bloku paměti můžete přistupovat ukazatelem zadaným při odpojení od objektu CMemFile voláním Detach.

Nejběžnějším použitím CMemFile je vytvoření objektu CMemFile a jeho použití voláním členských funkcí CFile . CMemFile Vytvoření automaticky se otevře: nezavoláte CFile::Open, který se používá jenom pro diskové soubory. Vzhledem k tomu CMemFile , že soubor disku nepoužívá, datový člen CFile::m_hFile se nepoužívá.

Členské CFile funkce Duplikovat, LockRange a UnlockRange nejsou implementovány pro CMemFile. Pokud tyto funkce zavoláte u objektu CMemFile , získáte CNotSupportedException.

CMemFile využívá funkce knihovny za běhu malloc, realloc a free k přidělování, relokaci a uvolnění paměti a vnitřní memcpy blokovat kopírování paměti při čtení a zápisu. Pokud chcete toto chování nebo chování změnit při CMemFile zvětšování souboru, odvozujte vlastní třídu a CMemFile přepište příslušné funkce.

Další informace naleznete CMemFilev článcích Soubory v prostředí MFC a Správa paměti (MFC) a viz Zpracování souborů v referenční dokumentaci knihovny za běhu.

Hierarchie dědičnosti

Objekt CObject

CFile

CMemFile

Požadavky

Hlavička: afx.h

CMemFile::Alloc

Tato funkce je volána členskými funkcemi CMemFile .

virtual BYTE* Alloc(SIZE_T nBytes);

Parametry

nBajty
Počet bajtů paměti, které se mají přidělit

Návratová hodnota

Ukazatel na přidělený blok paměti nebo hodnotu NULL, pokud přidělení selhalo.

Poznámky

Tuto funkci přepište tak, aby implementovaly vlastní přidělení paměti. Pokud tuto funkci přepíšete, pravděpodobně budete chtít také přepsat funkci Free a Realloc .

Výchozí implementace používá k přidělení paměti malloc funkce knihovny runtime.

CMemFile::Attach

Voláním této funkce připojíte blok paměti .CMemFile

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

Parametry

lpBuffer
Ukazatel na vyrovnávací paměť, ke které CMemFilese má připojit .

nBufferSize
Celé číslo, které určuje velikost vyrovnávací paměti v bajtech.

nGrowBytes
Přidělení paměti se zvýší v bajtech.

Poznámky

To způsobí CMemFile použití bloku paměti jako souboru paměti.

Pokud je nGrowBytes 0, CMemFile nastaví se délka souboru na nBufferSize. To znamená, že data v bloku paměti před tím, než byla připojena CMemFile , budou použita jako soubor. Soubory paměti vytvořené tímto způsobem nelze zvětšit.

Vzhledem k tomu, že soubor nejde zvětšit, dávejte pozor, abyste CMemFile se pokusili soubor zvětšit. Například nevolejte CMemFile přepsání CFile:Write pro zápis za konec nebo nevolejte CFile:SetLength s délkou delší než nBufferSize.

Pokud je nGrowBytes větší než 0, CMemFile bude ignorovat obsah připojeného bloku paměti. Obsah souboru paměti budete muset zapsat úplně od začátku pomocí CMemFile přepsání CFile::Write. Pokud se pokusíte zapsat za konec souboru nebo zvětšit soubor voláním přepsání , zvýší přidělení paměti v přírůstcích nGrowBytes. CMemFile CFile::SetLengthCMemFile Zvětšení přidělení paměti selže, pokud se blok paměti, do Attach který předáte, nepřidělil metodou kompatibilní s Alloc. Chcete-li být kompatibilní s výchozí implementací Alloc, musíte přidělit paměť s funkcí knihovny runtime malloc nebo calloc.

CMemFile::CMemFile

První přetížení otevře prázdný soubor paměti.

CMemFile(UINT nGrowBytes = 1024);

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

Parametry

nGrowBytes
Přidělení paměti se zvýší v bajtech.

lpBuffer Ukazatel na vyrovnávací paměť, která přijímá informace o velikosti nBufferSize.

nBufferSize
Celé číslo, které určuje velikost vyrovnávací paměti souboru v bajtech.

Poznámky

Soubor je otevřen konstruktorem. Nezavolejte CFile::Open.

Druhé přetížení funguje stejně jako v případě, že jste použili první konstruktor a okamžitě volali Attach se stejnými parametry. Podrobnosti najdete Attach v tématu.

Příklad

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

Voláním této funkce získáte ukazatel na blok paměti používaný CMemFile.

BYTE* Detach();

Návratová hodnota

Ukazatel na blok paměti, který obsahuje obsah souboru paměti.

Poznámky

Volání této funkce také zavře CMemFile. Blok paměti CMemFile můžete znovu připojit voláním připojit. Pokud chcete soubor znovu připojit a použít v něm data, měli byste volat CFile::GetLength získat délku souboru před voláním Detach. Pokud k němu připojíte blok CMemFile paměti, abyste mohli použít jeho data ( nGrowBytes == 0), nemůžete soubor paměti zvětšit.

CMemFile::Free

Tato funkce je volána členskými funkcemi CMemFile .

virtual void Free(BYTE* lpMem);

Parametry

lpMem
Ukazatel na paměť, která se má uvolnit.

Poznámky

Tuto funkci přepište tak, aby implementovaly vlastní přidělení paměti. Pokud tuto funkci přepíšete, pravděpodobně budete chtít také přepsat funkci Alloc a Realloc .

CMemFile::GetBufferPtr

Získejte nebo zapište do vyrovnávací paměti, která zálohuje soubor paměti.

virtual UINT GetBufferPtr(
    UINT nCommand,
    UINT nCount = 0,
    void** ppBufStart = NULL,
    void** ppBufMax = NULL
);

Parametry

nCommand
Vyrovnávací paměťCommand provádět (bufferCheck, bufferCommit, bufferRead, nebo bufferWrite ).

nCount
V závislosti na příkazu nCommand počet bajtů v vyrovnávací paměti pro čtení, zápis nebo potvrzení. Při čtení z vyrovnávací paměti zadejte -1 pro vrácení vyrovnávací paměti z aktuální pozice na konec souboru.

PpBufStart
[ven] Začátek vyrovnávací paměti. Musí být NULL , pokud nCommand je bufferCommit.

ppBufMax
[ven] Konec vyrovnávací paměti. Musí být NULL , pokud nCommand je bufferCommit.

Návratová hodnota

hodnota příkazu Vrácená hodnota
buffercheck Vrátí hodnotu bufferDirect , pokud je podporováno přímé ukládání do vyrovnávací paměti, jinak 0.
bufferCommit Návraty 0
bufferRead nebo bufferWrite Vrátí počet bajtů ve vráceném prostoru vyrovnávací paměti. ppBufStart a ppBufMax ukazují na začátek a konec vyrovnávací paměti pro čtení a zápis.

Poznámky

Aktuální pozice v vyrovnávací paměti (m_nPosition) je rozšířena následujícími způsoby v závislosti na nCommand:

nCommand umístění vyrovnávací paměti
bufferCommit Aktuální pozice se posune o velikost potvrzené vyrovnávací paměti.
bufferRead Aktuální pozice se posune o velikost vyrovnávací paměti pro čtení.

CMemFile::GrowFile

Tato funkce je volána několika CMemFile členskými funkcemi.

virtual void GrowFile(SIZE_T dwNewLen);

Parametry

dwNewLen
Nová velikost souboru paměti.

Poznámky

Pokud chcete změnit způsob CMemFile růstu jeho souboru, můžete ho přepsat. Výchozí implementace volá realloc zvětšit existující blok (nebo alokace vytvořit blok paměti), přidělení paměti v násobcích nGrowBytes hodnoty zadané v konstruktoru nebo připojit volání.

CMemFile::Memcpy

Tato funkce je volána přepsáním CMemFile CFile::Read a CFile::Write pro přenos dat do a ze souboru paměti.

virtual BYTE* Memcpy(
    BYTE* lpMemTarget,
    const BYTE* lpMemSource,
    SIZE_T nBytes);

Parametry

lpMemTarget
Ukazatel na blok paměti, do kterého bude zdrojová paměť zkopírována.

lpMemSource
Ukazatel na zdrojový blok paměti.

nBajty
Počet bajtů, které se mají zkopírovat

Návratová hodnota

Kopie lpMemTarget.

Poznámky

Tuto funkci přepište, pokud chcete změnit způsob, jakým CMemFile tyto kopie paměti fungují.

CMemFile::Realloc

Tato funkce je volána členskými funkcemi CMemFile .

virtual BYTE* Realloc(
    BYTE* lpMem,
    SIZE_T nBytes);

Parametry

lpMem
Ukazatel na blok paměti, který má být relokován.

nBajty
Nová velikost bloku paměti.

Návratová hodnota

Ukazatel na blok paměti, který byl relokován (a pravděpodobně přesunut) nebo NULL v případě selhání skutečné polohy.

Poznámky

Tuto funkci přepište tak, aby implementovaly vlastní relokaci paměti. Pokud tuto funkci přepíšete, pravděpodobně budete chtít také přepsat alloc a Free .

Viz také

CFile – třída
Graf hierarchie