#include <windows.h>
#include <stdio.h>
#include <errno.h>
int main (int argc, char *argv [])
{
HANDLE hInFile, hOutFile;
HANDLE hInMap, hOutMap;
const void *pIn;
void *pOut;
DWORD dwSize;
if (argc != 3) {
printf ("Usage: cp file1 file2\n");
return 1;
}
if ((hInFile=CreateFile(argv[1],
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
0))==INVALID_HANDLE_VALUE) {
printf ("Error opening input file: %s. Error Number: %d",
argv [1], GetLastError());
return 2;
}
if ((dwSize=GetFileSize(hInFile, NULL))==0xffffffff) {
printf ("Error getting input file size: %s. Error Number: %d",
argv [1], GetLastError());
return 2;
}
if ((hInMap=CreateFileMapping(hInFile,
NULL,
PAGE_READONLY,
0,
dwSize,
NULL))==NULL) {
printf ("Error creating input file mapping: %s. Error Number: %d",
argv [1], GetLastError());
return 2;
}
if ((pIn=MapViewOfFile(
hInMap,
FILE_MAP_READ,
0, 0, dwSize))==NULL) {
printf ("Error mapping view of input file: %s. Error Number: %d",
argv [1], GetLastError());
return 2;
}
if ((hOutFile=CreateFile(argv[2],
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING,
0))==INVALID_HANDLE_VALUE) {
printf ("Error opening output file: %s. Error Number: %d",
argv [2], GetLastError());
return 2;
}
if ((hOutMap=CreateFileMapping(hOutFile,
NULL,
PAGE_READWRITE,
0,
dwSize,
NULL))==NULL) {
printf ("Error creating output file mapping. %s: Error Number: %d",
argv [2], GetLastError());
return 2;
}
if ((pOut=MapViewOfFile(
hOutMap,
FILE_MAP_WRITE,
0, 0, dwSize))==NULL) {
printf ("Error mapping view of output file. %s: Error Number: %d",
argv [2], GetLastError());
return 2;
}
CopyMemory(pOut, pIn, dwSize); /* Alternative to C library memcpy */
UnmapViewOfFile (pIn);
UnmapViewOfFile (pOut);
CloseHandle (hInMap);
CloseHandle (hOutMap);
CloseHandle (hInFile);
CloseHandle (hOutFile);
return 0;
}
MFC의 CFile나 fopen/fread/fwrite 보다 20% 이상의 성능 향상을 볼수 있다.
CopyMemory 부분만 살짝 손대면 된다.
어차피 IO처리라서 큰 차이가 없을것으로 생각했는데..
생각보다 큰 성능 차이를 보여 준다.