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 nGrowBytes
pří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 CMemFile
v č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
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é CMemFile
se 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::SetLength
CMemFile
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 .