File Memory Mapping - 대용량 파일 입출력 처리 [펌]

반응형

파일내용을 그대로 메모리에 올려서 메모리에 올려진 파일내용을 수정하고 수정된 내용을 디스크 파일에 쓴다.

순서는 다음과 같다.

- 파일 오픈                                                                               hF=CreateFile("test.txt")
- 파일 내용을 메모리에 올린다                                                hMapF=CreateFileMapping(hF)
- 메모리에 올려진 첫번째 주소를 얻는다.                               pF=MapViewOfFile(hMapF)
- 첫번째 주소로 메모리 내용을 조작한다.
- 중간중간에 변경된 내용을 강제로 디스크에 쓰게만든다.    FlushViewOfFile(pF)
- 해제.                                                                                      UnmapViewOfFile(pF);
- 해제.                                                                                      CloseHandle(hMapF);
- 파일 닫기.                                                                              CloseHandle(hF);

<예제>

#include <windows.h>
#include <stdio.h>
 
int main(int argc, char **argv)
{
  HANDLE hFile, hMapFile;
  DWORD dwFileSize;
  char *pFile, *pFileTemp;
  
  // MMF 1단계 : 파일 Create 또는 OPEN
  hFile = CreateFile( "test.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  // hFile = CreateFile( "test.txt", GENERIC_READ, FILESHARE_READ, NULL, OPEN_EXISTING, 0, NULL); // 읽기
 
  dwFileSize = GetFileSize( hFile, NULL );
  // MMF 2단계 : 파일 Mapping 생성  
  hMapFile = CreateFileMapping( hFile, NULL, PAGE_READWRITE, 0, 0, NULL );
  // hMapFile = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL );    // 읽기
 
  if( hMapFile == NULL )
  {
    printf( "CreateFileMapping() fail" );
    CloseHandle( hFile );
    return 1;
  }
  // MMF 3단계 : 매핑 객체를 사용해서 파일을 가상 주소와 연결.
  pFile = (char*)MapViewOfFile( hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
  //pFile = (char*)MapViewOfFile( hMapFile, FILE_MAP_READ, 0, 0, 0 );
 
 
  // Do SomeThing...
  pFileTemp = pFile;
 
  for(UINT i = 0; i < dwFileSize; i++ )
  {
    *pFileTemp = (*pFileTemp + 1);
    pFileTemp++;
  }
  // SomeThing End..
 
 
  //메모리 내용을 강제로 파일에 쓴다.
  FlushViewOfFile( pFile, 0 );
 
  UnmapViewOfFile( pFile );
  CloseHandle( hMapFile );
  CloseHandle( hFile );
 
  return 0;
}

추가 참고 :
http://dakuo.tistory.com/112
http://blog.naver.com/kkan22?Redirect=Log&logNo=80109503987

'Study > C++' 카테고리의 다른 글

boost 설치 하기  (0) 2010.08.10
boost.org 에 있는 boost library 목록 정리  (0) 2010.08.10
Virtual inheritance  (0) 2010.07.29
vswprintf_s 사용법  (0) 2010.07.08
선언과 정의  (0) 2010.07.08
TAGS.

Comments