MFC 또는 기타 파일 클래스나 핸들러를 이용해서는
MB 단위의 파일을 읽는데 굉장한 애로사항이 있다...(궁금하면 한번 해보도록)
그래서 우리는 뭔가 다른 혁신적인 방법이 필요한데..
Memory Map File이란 걸 이용하면 MB단위 이상의 파일도 비교적 빨리 변수로 읽어들일 수 있다.
자, 예제를 보자.
HANDLE hFile, hFileMap;
DWORD dwFileSize;
char *szCode;
CString strCode;
// 읽기 전용으로 lpszPathName인 파일을 읽는다.
hFile = CreateFile(lpszPathName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE )
{
AfxMessageBox("File Handle invalid value. Failed file open\n", MB_OK | MB_ICONERROR);
return FALSE;
}
dwFileSize = GetFileSize(hFile, NULL);
// dwFileSize 만큼 메모리에 쓴다.
hFileMap = CreateFileMapping(hFile, NULL, PAGE_WRITECOPY, 0, dwFileSize, NULL);
if( hFileMap == NULL )
{
AfxMessageBox("FileMap Handle is NULL. Failed file open\n", MB_OK | MB_ICONERROR );
CloseHandle(hFile);
return FALSE;
}
szCode = (char *)MapViewOfFile(hFileMap, FILE_MAP_COPY, 0, 0, 0);
strCode = szCode;
CloseHandle(hFileMap);
CloseHandle(hFile);
간단하고 빠른 사용법.
구조를 대강 보면 파일을 열기만 한다음 메모리에 그냥 왕창 복사해버리는 모양..
다른 방법에 비해서 굉장한 읽기 속도를 자랑한다.
파일과 메모리 파일 핸들러는 반드시 사용후 CloseHandle로 닫아줘야한다.
그렇지 않으면 프로그램을 종료하지 않는 한 한번 연 파일은 다시 열 수 없다[...]
왜냐면 파일과 메모리가 연결되어 있으니까~라고 예상하고 있음
함수와 매크로에 관해 궁금한 사항은 MSDN에 아주 쉽고 자세히 나와있다~
'C & C++ > C & C++' 카테고리의 다른 글
[Api] Win32 API 기반으로 구현한 StopWatch (0) | 2011.04.14 |
---|---|
[Tip] 확장자 연결 프로그램 (0) | 2011.04.14 |
CString Remove 함수 '한글' 사용시 주의사항... (0) | 2011.04.14 |
전처리 지시어 (0) | 2011.04.14 |
ini 파일 읽고 쓰기 (0) | 2011.04.14 |
댓글