CMemFile 類別
支援記憶體檔案的 CFile 衍生類別。
語法
class CMemFile : public CFile
成員
公用建構函式
名稱 | 描述 |
---|---|
CMemFile::CMemFile | 建構記憶體檔物件。 |
公用方法
名稱 | 描述 |
---|---|
CMemFile::Attach | 將記憶體區塊附加至 CMemFile 。 |
CMemFile::D etach | 中斷連結記憶體 CMemFile 區塊,並傳回中斷連結記憶體區塊的指標。 |
CMemFile::GetBufferPtr | 取得或寫入備份記憶體檔案的記憶體緩衝區。 |
受保護的方法
名稱 | 描述 |
---|---|
CMemFile::Alloc | 覆寫以修改記憶體配置行為。 |
CMemFile::Free | 覆寫 以修改記憶體解除分配行為。 |
CMemFile::GrowFile | 覆寫 以在成長檔案時修改行為。 |
CMemFile::Memcpy | 覆寫以修改讀取和寫入檔案時的記憶體複製行為。 |
CMemFile::Realloc | 覆寫以修改記憶體重新配置行為。 |
備註
這些記憶體檔案的行為就像磁碟檔案,不同之處在於檔案會儲存在 RAM 中,而不是儲存在磁碟上。 記憶體檔案適用於:
- 快速暫存記憶體
- 在獨立進程之間傳輸原始位元組
- 在獨立進程之間傳輸串行化物件
CMemFile
物件可以自動配置自己的記憶體。 或者,您可以呼叫 Attach,將自己的記憶體區塊附加至 CMemFile
物件。 不論是哪一種情況,如果nGrowBytes
不是零,會自動配置nGrowBytes
記憶體檔案的記憶體大小遞增。
如果物件原本配置CMemFile
記憶體,記憶體區塊會在物件破壞CMemFile
時自動刪除;否則,您必須負責解除分配您附加至對象的記憶體。
您可以藉由呼叫 Detach,透過從物件卸離CMemFile
時提供的指標存取記憶體區塊。
最常見的用法 CMemFile
是建立 CMemFile
物件,並藉由呼叫 CFile 成員函式來使用它。 CMemFile
建立自動開啟它:您不會呼叫 CFile::Open,這隻適用於磁碟檔案。 因為 CMemFile
不會使用磁碟檔案,因此不會使用數據成員 CFile::m_hFile
。
成員CFile
函式 Duplicate、LockRange 和 UnlockRange 不會針對 實作CMemFile
。 如果您在 物件上 CMemFile
呼叫這些函式,您將會收到 CNotSupportedException。
CMemFile
會使用運行時間連結庫函式 malloc、 realloc 和 free 來配置、重新配置和解除分配記憶體;以及內部 memcpy 在讀取和寫入時封鎖複製記憶體。 如果您想要在成長檔案時 CMemFile
變更此行為或行為,請從 CMemFile
衍生您自己的類別並覆寫適當的函式。
如需 的詳細資訊CMemFile
,請參閱 MFC 中的檔案和記憶體管理文章(MFC),請參閱運行時間連結庫中的檔案處理參考。
繼承階層架構
CMemFile
需求
標頭: afx.h
CMemFile::Alloc
此函式是由成員函式呼叫 CMemFile
。
virtual BYTE* Alloc(SIZE_T nBytes);
參數
nBytes
要配置的記憶體位元組數目。
傳回值
已配置的記憶體區塊指標,如果配置失敗,則為NULL。
備註
覆寫此函式以實作自定義記憶體配置。 如果您覆寫此函式,您可能也會想要覆寫 Free 和 Realloc 。
默認實作會使用運行時間連結庫函 式 malloc 來配置記憶體。
CMemFile::Attach
呼叫此函式,將記憶體區塊附加至 CMemFile
。
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
參數
lpBuffer
要附加至 CMemFile
之緩衝區的指標。
nBufferSize
整數,指定以位元組為單位的緩衝區大小。
nGrowBytes
記憶體配置以位元組為單位遞增。
備註
這會導致 CMemFile
使用記憶體區塊作為記憶體檔案。
如果 nGrowBytes 為 0, CMemFile
會將檔案長度設定為 nBufferSize。 這表示在附加至 CMemFile
記憶體區塊之前的數據會當做檔案使用。 以這種方式建立的記憶體檔案無法成長。
由於無法成長檔案,請小心不要造成 CMemFile
嘗試成長檔案。 例如,請勿呼叫 CMemFile
CFile:Write 的覆寫,以寫入結束,或不要呼叫長度超過 nBufferSize 的 CFile:SetLength。
如果 nGrowBytes 大於 0, CMemFile
將會忽略您附加的記憶體區塊內容。 您必須使用 CMemFile
的覆寫 CFile::Write
,從頭開始寫入記憶體檔案的內容。 如果您嘗試透過呼叫 CMemFile
覆CFile::SetLength
寫 來寫入檔尾或擴大檔案,CMemFile
將會以 nGrowBytes 遞增的方式增加記憶體配置。 如果您傳遞至 Attach
的記憶體區塊未配置與 Alloc 相容的方法,則增加記憶體配置將會失敗。 若要與的預設實作Alloc
相容,您必須使用運行時間連結庫函式 malloc 或 calloc 配置記憶體。
CMemFile::CMemFile
第一個多載會開啟空的記憶體檔案。
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
參數
nGrowBytes
記憶體配置以位元組為單位遞增。
lpBuffer 接收 nBufferSize 大小資訊的緩衝區指標。
nBufferSize
整數,指定檔案緩衝區的大小,以位元組為單位。
備註
建構函式會開啟檔案。 請勿呼叫 CFile::Open。
第二個多載的作用與您使用第一個建構函式相同,並立即使用相同的參數呼叫 Attach 。 如需詳細資訊,請參閱 Attach
。
範例
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
呼叫此函式,以取得 所 CMemFile
使用記憶體區塊的指標。
BYTE* Detach();
傳回值
記憶體區塊的指標,其中包含記憶體檔案的內容。
備註
呼叫此函式也會關閉 CMemFile
。 您可以呼叫 Attach,將記憶體區塊重新附加至 CMemFile
。 如果您想要重新附加檔案並使用其中的數據,您應該先呼叫 CFile::GetLength 以取得檔案的長度,然後再呼叫 Detach
。 如果您將記憶體區塊附加至 CMemFile
,以便使用其資料 ( nGrowBytes
== 0),則您無法成長記憶體檔案。
CMemFile::Free
此函式是由成員函式呼叫 CMemFile
。
virtual void Free(BYTE* lpMem);
參數
lpMem
要解除分配之內存的指標。
備註
覆寫此函式以實作自定義記憶體解除分配。 如果您覆寫此函式,您可能也會想要覆寫 Alloc 和 Realloc 。
CMemFile::GetBufferPtr
取得或寫入備份記憶體檔案的記憶體緩衝區。
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
參數
nCommand
要執行 (bufferCheck
、 、 bufferCommit
bufferRead
或 bufferWrite
) 的 bufferCommand 。
nCount
根據 nCommand,要讀取、寫入或認可之緩衝區中的位元元組數目。 從緩衝區讀取時,請指定 -1,將緩衝區從目前位置傳回至檔尾。
ppBufStart
[out]緩衝區的開頭。 必須是 NULL
nCommand 為 bufferCommit
時。
ppBufMax
[out]緩衝區的結尾。 必須是 NULL
nCommand 為 bufferCommit
時。
傳回值
命令 值 | 傳回值 |
---|---|
buffercheck |
如果支援直接緩衝,則傳 回 bufferDirect ,否則傳回 0。 |
bufferCommit |
傳回 0 。 |
bufferRead 或 bufferWrite |
傳回之緩衝區空間中的位元元數目。 ppBufStart 和 ppBufMax 指向讀取/寫入緩衝區的開頭和結尾。 |
備註
記憶體緩衝區 (m_nPosition
) 中的目前位置會以下列方式進階,視 nCommand 而定:
nCommand | 緩衝區位置 |
---|---|
bufferCommit |
目前的位置會依已認可的緩衝區大小前進。 |
bufferRead |
目前的位置會依讀取緩衝區的大小前進。 |
CMemFile::GrowFile
此函式是由數個 CMemFile
成員函式所呼叫。
virtual void GrowFile(SIZE_T dwNewLen);
參數
dwNewLen
記憶體檔案的新大小。
備註
如果您想要變更檔案成長方式 CMemFile
,可以覆寫它。 默認實作會呼叫 Realloc 來成長現有的區塊(或 Alloc 以建立記憶體區塊),並在建構函式或 Attach 呼叫中指定的值倍nGrowBytes
數中配置記憶體。
CMemFile::Memcpy
此函式是由 CMemFile
CFile::Read 和 CFile::Write 的覆寫所呼叫,以將數據傳送至記憶體檔案或從記憶體檔案傳送數據。
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
參數
lpMemTarget
將複製來源記憶體之內存區塊的指標。
lpMemSource
來源記憶體區塊的指標。
nBytes
要複製的位元組數目。
傳回值
lpMemTarget 的複本。
備註
如果您想要變更執行這些記憶體複本的方式, CMemFile
請覆寫此函式。
CMemFile::Realloc
此函式是由成員函式呼叫 CMemFile
。
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
參數
lpMem
要重新配置之內存區塊的指標。
nBytes
記憶體區塊的新大小。
傳回值
重新配置記憶體區塊的指標(可能已移動),如果重新配置失敗,則為 NULL。
備註
覆寫此函式以實作自定義記憶體重新配置。 如果您覆寫此函式,您可能也會想要覆寫 Alloc 和 Free 。