共用方式為


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), 請參閱 執行時間程式庫中的 檔案處理 參考

繼承階層架構

CObject

CFile

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 ,從頭開始寫入記憶體檔案的內容。 如果您嘗試透過呼叫 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
要解除配置之記憶體的指標。

備註

覆寫此函式以實作自訂記憶體解除配置。 如果您覆寫此函式,您可能也會想要覆寫 Alloc Realloc

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 nCommand bufferCommit

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

傳回值

命令 傳回值
buffercheck 如果支援直接緩衝,則傳 回 bufferDirect ,否則傳回 0。
bufferCommit 傳回 0
bufferReadbufferWrite 傳回之緩衝區空間中的位元組數目。 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

另請參閱

CFile 類別
階層架構圖表