파일내용을 그대로 메모리에 올려서 메모리에 올려진 파일내용을 수정하고 수정된 내용을 디스크 파일에 쓴다. 순서는 다음과 같다.
- 파일 오픈 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;
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;
}
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;
}
#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;
}
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;
}
덧글을 달아 주세요