共用方式為


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函式 DuplicateLockRange 和 UnlockRange 不會針對 實作CMemFile。 如果您在 物件上 CMemFile 呼叫這些函式,您將會收到 CNotSupportedException

CMemFile 會使用運行時間連結庫函式 mallocreallocfree 來配置、重新配置和解除分配記憶體;以及內部 memcpy 在讀取和寫入時封鎖複製記憶體。 如果您想要在成長檔案時 CMemFile 變更此行為或行為,請從 CMemFile 衍生您自己的類別並覆寫適當的函式。

如需 的詳細資訊CMemFile,請參閱 MFC 中的檔案和記憶體管理文章(MFC),請參閱運行時間連結庫中的檔案處理參考

繼承階層架構

CObject

CFile

CMemFile

需求

標頭: afx.h

CMemFile::Alloc

此函式是由成員函式呼叫 CMemFile

virtual BYTE* Alloc(SIZE_T nBytes);

參數

nBytes
要配置的記憶體位元組數目。

傳回值

已配置的記憶體區塊指標,如果配置失敗,則為NULL。

備註

覆寫此函式以實作自定義記憶體配置。 如果您覆寫此函式,您可能也會想要覆寫 FreeRealloc

默認實作會使用運行時間連結庫函 式 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 的覆寫,以寫入結束,或不要呼叫長度超過 nBufferSizeCFile:SetLength。

如果 nGrowBytes 大於 0, CMemFile 將會忽略您附加的記憶體區塊內容。 您必須使用 CMemFile 的覆寫 CFile::Write,從頭開始寫入記憶體檔案的內容。 如果您嘗試透過呼叫 CMemFileCFile::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
要解除分配之內存的指標。

備註

覆寫此函式以實作自定義記憶體解除分配。 如果您覆寫此函式,您可能也會想要覆寫 AllocRealloc

CMemFile::GetBufferPtr

取得或寫入備份記憶體檔案的記憶體緩衝區。

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

參數

nCommand
要執行 (bufferCheck、 、 bufferCommitbufferReadbufferWrite ) 的 bufferCommand

nCount
根據 nCommand,要讀取、寫入或認可之緩衝區中的位元元組數目。 從緩衝區讀取時,請指定 -1,將緩衝區從目前位置傳回至檔尾。

ppBufStart
[out]緩衝區的開頭。 必須是 NULL nCommandbufferCommit

ppBufMax
[out]緩衝區的結尾。 必須是 NULL nCommand 為 bufferCommit時。

傳回值

命令 傳回值
buffercheck 如果支援直接緩衝,則傳 回 bufferDirect ,否則傳回 0。
bufferCommit 傳回 0
bufferReadbufferWrite 傳回之緩衝區空間中的位元元數目。 ppBufStartppBufMax 指向讀取/寫入緩衝區的開頭和結尾。

備註

記憶體緩衝區 (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::ReadCFile::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。

備註

覆寫此函式以實作自定義記憶體重新配置。 如果您覆寫此函式,您可能也會想要覆寫 AllocFree

另請參閱

CFile 類別
階層架構圖表