Freigeben über


CMemFile-Klasse

Die von CFile abgeleitete Klasse, die Speicherdateien unterstützt.

Syntax

class CMemFile : public CFile

Member

Öffentliche Konstruktoren

Name Beschreibung
CMemFile::CMemFile Erstellt ein Speicherdateiobjekt.

Öffentliche Methoden

Name Beschreibung
CMemFile::Attach Fügt einen Speicherblock an CMemFile.
CMemFile::D etach Trennt den Speicherblock und CMemFile gibt einen Zeiger auf den Speicherblock zurück, der getrennt ist.
CMemFile::GetBufferPtr Dient zum Abrufen oder Schreiben in den Speicherpuffer, der eine Speicherdatei zurückgibt.

Geschützte Methoden

Name Beschreibung
CMemFile::Alloc AußerKraftsetzung zum Ändern des Speicherzuweisungsverhaltens.
CMemFile::Free Außerkraftsetzung zum Ändern des Speicher-Deallocation-Verhaltens.
CMemFile::GrowFile Überschreiben, um das Verhalten beim Anbau einer Datei zu ändern.
CMemFile::Memcpy Außerkraftsetzung zum Ändern des Speicherkopieverhaltens beim Lesen und Schreiben von Dateien.
CMemFile::Realloc Überschreiben, um das Speicher-Relocation-Verhalten zu ändern.

Hinweise

Diese Speicherdateien verhalten sich wie Datenträgerdateien, außer dass die Datei im RAM und nicht auf dem Datenträger gespeichert ist. Eine Speicherdatei ist nützlich für:

  • Schneller temporärer Speicher
  • Übertragen von Rohbytes zwischen unabhängigen Prozessen
  • Übertragen serialisierter Objekte zwischen unabhängigen Prozessen

CMemFile Objekte können automatisch ihren eigenen Speicher zuordnen. Sie können auch einen eigenen Speicherblock an das CMemFile Objekt anfügen, indem Sie Attach aufrufen. In beiden Fällen wird der Speicher für die Erweiterung der Speicherdatei automatisch in Schritten der nGrowBytesGröße zugewiesen, wenn nGrowBytes nicht 0.

Der Speicherblock wird beim Löschen des CMemFile Objekts automatisch gelöscht, wenn der Speicher ursprünglich vom CMemFile Objekt zugewiesen wurde. Andernfalls sind Sie für die Zuordnung des speichers verantwortlich, den Sie an das Objekt angefügt haben.

Sie können über den angegebenen Zeiger auf den Speicherblock zugreifen, wenn Sie ihn vom CMemFile Objekt trennen, indem Sie "Detach" aufrufen.

Die häufigste Verwendung CMemFile besteht darin, ein CMemFile Objekt zu erstellen und zu verwenden, indem CFile-Memberfunktionen aufgerufen werden. Das Erstellen eines CMemFile automatisch geöffneten Vorgangs wird automatisch geöffnet: Sie rufen CFile::Open nicht auf, das nur für Datenträgerdateien verwendet wird. Da CMemFile keine Datenträgerdatei verwendet wird, wird das Datenelement CFile::m_hFile nicht verwendet.

Die CFile Memberfunktionen "Duplicate", "LockRange" und "UnlockRange" werden nicht implementiert.CMemFile Wenn Sie diese Funktionen für ein CMemFile Objekt aufrufen, erhalten Sie eine CNotSupportedException.

CMemFileverwendet die Laufzeitbibliotheksfunktionen malloc, realloc und kostenlos, um Speicher zuzuweisen, neu zuzuordnen und zu behandeln; und das systeminterne Memcpy, um den Kopierspeicher beim Lesen und Schreiben zu blockieren. Wenn Sie dieses Verhalten oder das Verhalten ändern möchten, wenn CMemFile eine Datei wächst, leiten Sie Ihre eigene Klasse von den entsprechenden Funktionen ab CMemFile und überschreiben Sie es.

Weitere Informationen CMemFilefinden Sie in den Artikeln "Files in MFC and Memory Management(MFC) " und unter "Dateiverarbeitung " in der Laufzeitbibliotheksreferenz.

Vererbungshierarchie

CObject

CFile

CMemFile

Anforderungen

Header: afx.h

CMemFile::Alloc

Diese Funktion wird von CMemFile Memberfunktionen aufgerufen.

virtual BYTE* Alloc(SIZE_T nBytes);

Parameter

nBytes
Anzahl der Zuteilung von Arbeitsspeicherbytes.

Rückgabewert

Ein Zeiger auf den speicherblock, der zugewiesen wurde, oder NULL, wenn die Zuordnung fehlgeschlagen ist.

Hinweise

Überschreiben Sie diese Funktion, um die benutzerdefinierte Speicherzuweisung zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie "Free" und "Realloc" wahrscheinlich auch außer Kraft setzen.

Die Standardimplementierung verwendet die Laufzeitbibliotheksfunktion malloc , um Arbeitsspeicher zuzuweisen.

CMemFile::Attach

Rufen Sie diese Funktion auf, um einen Speicherblock anzufügen CMemFile.

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

Parameter

lpBuffer
Zeiger auf den Puffer, der angefügt CMemFilewerden soll.

nBufferSize
Eine ganze Zahl, die die Größe des Puffers in Bytes angibt.

nGrowBytes
Die Speicherzuordnung in Bytes erhöht.

Hinweise

Dies bewirkt CMemFile , dass der Speicherblock als Speicherdatei verwendet wird.

Wenn nGrowBytes 0 ist, CMemFile wird die Dateilänge auf nBufferSize festgelegt. Dies bedeutet, dass die Daten im Speicherblock, bevor sie angefügt CMemFile wurden, als Datei verwendet werden. Auf diese Weise erstellte Speicherdateien können nicht vergrößert werden.

Da die Datei nicht vergrößert werden kann, achten Sie darauf, nicht zu versuchen CMemFile , die Datei zu vergrößern. Rufen Sie beispielsweise nicht die CMemFile Außerkraftsetzungen von "CFile:Write" auf, um über das Ende zu schreiben, oder rufen Sie CFile:SetLength nicht mit einer Länge auf, die länger als nBufferSize ist.

Wenn nGrowBytes größer als 0 ist, CMemFile wird der Inhalt des angefügten Speicherblocks ignoriert. Sie müssen den Inhalt der Speicherdatei ganz neu schreiben, indem Sie die CMemFile Außerkraftsetzung verwenden CFile::Write. Wenn Sie versuchen, über das Ende der Datei zu schreiben oder die Datei zu vergrößern, indem Sie die CMemFile Außerkraftsetzung CFile::SetLengthaufrufen, CMemFile wird die Speicherzuweisung in Schritten von nGrowBytes vergrößert. Das Vergrößern der Speicherzuweisung schlägt fehl, wenn der von Ihnen übergebene Attach Speicherblock nicht mit einer methode zugeordnet wurde, die mit Alloc kompatibel ist. Um mit der Standardimplementierung Allockompatibel zu sein, müssen Sie den Speicher mit der Laufzeitbibliotheksfunktion malloc oder calloc zuweisen.

CMemFile::CMemFile

Die erste Überladung öffnet eine leere Speicherdatei.

CMemFile(UINT nGrowBytes = 1024);

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

Parameter

nGrowBytes
Die Speicherzuordnung in Bytes erhöht.

lpBuffer Pointer auf einen Puffer, der Informationen zur Größe nBufferSize empfängt.

nBufferSize
Eine ganze Zahl, die die Größe des Dateipuffers in Bytes angibt.

Hinweise

Die Datei wird vom Konstruktor geöffnet. Rufen Sie CFile::Open nicht auf.

Die zweite Überladung fungiert genauso wie bei Verwendung des ersten Konstruktors und sofort mit dem Aufruf "Anfügen " mit denselben Parametern. Einzelheiten dazu finden Sie unter Attach.

Beispiel

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

Rufen Sie diese Funktion auf, um einen Zeiger auf den von .CMemFile

BYTE* Detach();

Rückgabewert

Ein Zeiger auf den Speicherblock, der den Inhalt der Speicherdatei enthält.

Hinweise

Durch Aufrufen dieser Funktion wird auch die CMemFile. Sie können den Speicherblock CMemFile erneut anfügen, indem Sie Attach aufrufen. Wenn Sie die Datei erneut anfügen und die Darin enthaltenen Daten verwenden möchten, sollten Sie CFile::GetLength aufrufen, um die Länge der Datei vor dem Aufrufen Detachabzurufen. Wenn Sie einen Speicherblock CMemFile anfügen, damit Sie dessen Daten ( nGrowBytes == 0) verwenden können, können Sie die Speicherdatei nicht vergrößern.

CMemFile::Free

Diese Funktion wird von CMemFile Memberfunktionen aufgerufen.

virtual void Free(BYTE* lpMem);

Parameter

lpMem
Zeiger auf den Speicher, der abgeglichen werden soll.

Hinweise

Überschreiben Sie diese Funktion, um benutzerdefinierte Speicher-Deallocation zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie wahrscheinlich auch Alloc und Realloc außer Kraft setzen.

CMemFile::GetBufferPtr

Dient zum Abrufen oder Schreiben in den Speicherpuffer, der eine Speicherdatei zurückgibt.

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

Parameter

nCommand
Der pufferBefehl , der ausgeführt werden soll (bufferCheck, bufferCommit, , bufferReadoder bufferWrite ).

nCount
Je nach nCommand wird die Anzahl der Bytes im Puffer zum Lesen, Schreiben oder Commit ausgeführt. Geben Sie beim Lesen aus dem Puffer -1 an, um einen Puffer von der aktuellen Position bis zum Ende der Datei zurückzugeben.

ppBufStart
[out] Der Anfang des Puffers. Muss sein NULL , wenn nCommand ist bufferCommit.

ppBufMax
[out] Das Ende des Puffers. Muss sein NULL , wenn nCommand ist bufferCommit.

Rückgabewert

Befehlswert Rückgabewert
buffercheck Gibt bufferDirect zurück, wenn die direkte Pufferung unterstützt wird, andernfalls 0.
bufferCommit Gibt 0 zurück.
bufferRead oder bufferWrite Gibt die Anzahl der Bytes im zurückgegebenen Pufferbereich zurück. ppBufStart und ppBufMax zeigen auf den Anfang und das Ende des Lese-/Schreibpuffers.

Hinweise

Die aktuelle Position im Speicherpuffer (m_nPosition) wird je nach nCommand wie folgt erweitert:

nCommand Pufferposition
bufferCommit Die aktuelle Position wechselt um die Größe des zugesicherten Puffers.
bufferRead Die aktuelle Position wechselt um die Größe des Lesepuffers.

CMemFile::GrowFile

Diese Funktion wird von mehreren Memberfunktionen CMemFile aufgerufen.

virtual void GrowFile(SIZE_T dwNewLen);

Parameter

dwNewLen
Neue Größe der Speicherdatei.

Hinweise

Sie können sie außer Kraft setzen, wenn Sie ändern möchten, wie CMemFile die Datei wächst. Die Standardimplementierung ruft Realloc auf, um einen vorhandenen Block (oder Alloc zum Erstellen eines Speicherblocks) zu vergrößern, um Arbeitsspeicher in Vielfachen des nGrowBytes im Konstruktor oder Attach-Aufruf angegebenen Werts zu zuordnen.

CMemFile::Memcpy

Diese Funktion wird von den CMemFile Außerkraftsetzungen von "CFile::Read " und "CFile::Write" aufgerufen, um Daten in und aus der Speicherdatei zu übertragen.

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

Parameter

lpMemTarget
Zeigen Sie auf den Speicherblock, in den der Quellspeicher kopiert wird.

lpMemSource
Zeigen Sie auf den Quellspeicherblock.

nBytes
Anzahl der zu kopierenden Bytes.

Rückgabewert

Eine Kopie von lpMemTarget.

Hinweise

Überschreiben Sie diese Funktion, wenn Sie die Art und Weise ändern möchten, CMemFile wie diese Speicherkopien ausgeführt werden.

CMemFile::Realloc

Diese Funktion wird von CMemFile Memberfunktionen aufgerufen.

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

Parameter

lpMem
Ein Zeiger auf den Speicherblock, der neu zugeordnet werden soll.

nBytes
Neue Größe für den Speicherblock.

Rückgabewert

Ein Zeiger auf den Speicherblock, der neu zugeordnet (und möglicherweise verschoben) wurde, oder NULL, wenn die Neuzuordnung fehlgeschlagen ist.

Hinweise

Überschreiben Sie diese Funktion, um eine benutzerdefinierte Speicherüberlastung zu implementieren. Wenn Sie diese Funktion außer Kraft setzen, sollten Sie wahrscheinlich auch Alloc und Free außer Kraft setzen.

Siehe auch

CFile-Klasse
Hierarchiediagramm