File Memory Mapping - 대용량 파일 입출력 처리 [펌]
파일내용을 그대로 메모리에 올려서 메모리에 올려진 파일내용을 수정하고 수정된 내용을 디스크 파일에 쓴다.
순서는 다음과 같다.
- 파일 오픈 hF=CreateFile("test.txt")
- 파일 내용을 메모리에 올린다 hMapF=CreateFileMapping(hF)
- 메모리에 올려진 첫번째 주소를 얻는다. pF=MapViewOfFile(hMapF)
- 첫번째 주소로 메모리 내용을 조작한다.
- 중간중간에 변경된 내용을 강제로 디스크에 쓰게만든다. FlushViewOfFile(pF)
- 해제. UnmapViewOfFile(pF);
- 해제. CloseHandle(hMapF);
- 파일 닫기. CloseHandle(hF);
<예제>
#include <stdio.h>
int main(int argc, char **argv)
{
HANDLE hFile, hMapFile;
DWORD dwFileSize;
char *pFile, *pFileTemp;
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 );
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 |