다음을 통해 공유


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 메모리 블록을 개체에 연결할 수 있습니다. 두 경우 모두 메모리 파일을 증가시키는 메모리는 0이 아닌 경우 nGrowBytes 크기가 증분된 값으로 자동으로 할당nGrowBytes됩니다.

메모리가 원래 개체에 의해 CMemFile 할당된 경우 개체가 CMemFile 소멸되면 메모리 블록이 자동으로 삭제됩니다. 그렇지 않으면 개체에 연결한 메모리의 할당을 취소해야 합니다.

분리를 호출하여 개체에서 분리할 때 제공된 포인터를 CMemFile 통해 메모리 블록에 액세스할 수 있습니다.

가장 일반적인 용도 CMemFile 는 CFile 멤버 함수를 CMemFile 호출하여 개체를 만들고 사용하는 것입니다. CMemFile 자동으로 만들면 디스크 파일에만 사용되는 CFile::Open을 호출하지 않습니다. CMemFile 디스크 파일을 사용하지 않으므로 데이터 멤버 CFile::m_hFile 가 사용되지 않습니다.

복제, LockRange 및 UnlockRange 멤버 함수는 에 대해 CMemFile구현되지 않습니다. CFile 개체에서 이러한 함수를 CMemFile 호출하면 CNotSupportedException발생합니다.

CMemFile는 런타임 라이브러리 함수 malloc, reallocfree를 사용하여 메모리를 할당, 재할당 및 할당 취소하고, 읽기 및 쓰기 시 메모리 복사를 차단하는 내장 memcpy를 사용합니다. 파일을 확장할 때 CMemFile 이 동작 또는 동작을 변경하려면 고유한 클래스 CMemFile 를 파생시키고 적절한 함수를 재정의합니다.

자세한 내용은 CMemFileMFC 및 MFC(메모리 관리)의 파일 문서를 참조하고 런타임 라이브러리 참조에서 파일 처리를 참조하세요.

상속 계층 구조

CObject

CFile

CMemFile

요구 사항

헤더: afx.h

CMemFile::Alloc

이 함수는 멤버 함수에 의해 CMemFile 호출됩니다.

virtual BYTE* Alloc(SIZE_T nBytes);

매개 변수

nBytes
할당할 메모리의 바이트 수입니다.

Return Value

할당된 메모리 블록에 대한 포인터이거나 할당에 실패한 경우 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 않도록 주의해야 합니다. 예를 들어 CFile:Write의 재정의를 호출 CMemFile 하여 끝을 지나 쓰거나 nBufferSize보다 긴 길이로 CFile:SetLength를 호출하지 마세요.

nGrowBytes가 0 CMemFile 보다 크면 연결한 메모리 블록의 내용을 무시합니다. 재정의를 사용하여 CMemFile CFile::Write메모리 파일의 내용을 처음부터 작성해야 합니다. 파일의 끝을 지나서 쓰거나 재정의 CFile::SetLengthCMemFile 를 호출 CMemFile 하여 파일을 증가시키려면 nGrowBytes 단위로 메모리 할당이 증가합니다. 전달 Attach 한 메모리 블록이 Alloc호환되는 메서드로 할당되지 않은 경우 메모리 할당 증가가 실패합니다. 기본 구현Alloc과 호환되려면 런타임 라이브러리 함수 malloc 또는 calloc를 사용하여 메모리를 할당해야 합니다.

CMemFile::CMemFile

첫 번째 오버로드는 빈 메모리 파일을 엽니다.

CMemFile(UINT nGrowBytes = 1024);

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

매개 변수

nGrowBytes
메모리 할당이 바이트 단위로 증가합니다.

nBufferSize 크기의 정보를 수신하는 버퍼에 대한 lpBuffer 포인터입니다.

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();

Return Value

메모리 파일의 내용을 포함하는 메모리 블록에 대한 포인터입니다.

설명

이 함수를 호출하면 CMemFile. Attach를 호출하여 메모리 블록을 CMemFile 다시 연결할 수 있습니다. 파일을 다시 연결하고 해당 파일을 사용하려면 CFile::GetLength를 호출하여 호출하기 전에 Detach파일의 길이를 가져와야 합니다. 해당 데이터( nGrowBytes == 0)를 사용할 수 있도록 메모리 블록을 CMemFile 연결하는 경우 메모리 파일을 늘릴 수 없습니다.

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
수행할 bufferCommand(bufferCheck, bufferCommit, bufferRead또는 bufferWrite )입니다.

nCount
nCommand따라 읽기, 쓰기 또는 커밋할 버퍼의 바이트 수입니다. 버퍼에서 읽을 때 -1을 지정하여 현재 위치에서 파일의 끝으로 버퍼를 반환합니다.

ppBufStart
[out] 버퍼의 시작입니다. nCommandNULL bufferCommit.일 때여야 합니다.

ppBufMax
[out] 버퍼의 끝입니다. nCommand가 NULL bufferCommit.일 때여야 합니다.

Return Value

명령 반환 값
buffercheck 직접 버퍼링이 지원되면 bufferDirect를 반환하고, 그렇지 않으면 0을 반환합니다.
bufferCommit 0를 반환합니다.
bufferRead 또는 bufferWrite 반환된 버퍼 공간의 바이트 수를 반환합니다. ppBufStartppBufMax 는 읽기/쓰기 버퍼의 시작과 끝을 가리킵니다.

설명

메모리 버퍼(m_nPosition)의 현재 위치는 nCommand따라 다음과 같은 방식으로 진행됩니다.

nCommand 버퍼 위치
bufferCommit 현재 위치는 커밋된 버퍼의 크기로 진행됩니다.
bufferRead 현재 위치는 읽기 버퍼의 크기로 이동합니다.

CMemFile::GrowFile

이 함수는 여러 멤버 함수에 CMemFile 의해 호출됩니다.

virtual void GrowFile(SIZE_T dwNewLen);

매개 변수

dwNewLen
메모리 파일의 새 크기입니다.

설명

파일의 증가 방식을 CMemFile 변경하려는 경우 재정의할 수 있습니다. 기본 구현에서는 Realloc을 호출하여 기존 블록(또는 메모리 블록을 만들기 위해 할당)을 증가시키고 생성자 또는 연결 호출에 지정된 값의 nGrowBytes 배수로 메모리를 할당합니다.

CMemFile::Memcpy

이 함수는 CFile::ReadCFile::Write의 재정의에 의해 CMemFile 호출되어 메모리 파일 간에 데이터를 전송합니다.

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

매개 변수

lpMemTarget
원본 메모리를 복사할 메모리 블록에 대한 포인터입니다.

lpMemSource
원본 메모리 블록에 대한 포인터입니다.

nBytes
복사할 바이트 수입니다.

Return Value

lpMemTarget의 복사본입니다.

설명

이러한 메모리 복사본을 수행하는 방식을 CMemFile 변경하려면 이 함수를 재정의합니다.

CMemFile::Realloc

이 함수는 멤버 함수에 의해 CMemFile 호출됩니다.

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

매개 변수

lpMem
다시 할당할 메모리 블록에 대한 포인터입니다.

nBytes
메모리 블록의 새 크기입니다.

Return Value

다시 할당되고 이동되었을 수 있는 메모리 블록에 대한 포인터이거나, 다시 할당에 실패한 경우 NULL입니다.

설명

사용자 지정 메모리 재할당을 구현하려면 이 함수를 재정의합니다. 이 함수를 재정의하는 경우 AllocFree도 재정의할 수 있습니다.

참고 항목

CFile 클래스
계층 구조 차트