更新时间:2016-06-20 23:08:42浏览次数:1+次
我们先来看一张图:
#include <Windows.h>
void main()
{
HANDLE hFile = CreateFile(L"D:/科洛弗道10号.rmvb", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)return;
DWORD MapSize = 1024*1024*256;//映射的大小,相当于缓冲区大小
LARGE_INTEGER FileSize,HandleFileSize,LeftFileSize;
HandleFileSize.QuadPart=0;
if(!GetFileSizeEx(hFile,&FileSize))
{
MessageBox(NULL,L"获取文件大小出错",L"出错",0);
return;
}
LeftFileSize.QuadPart = FileSize.QuadPart;
//内存映射文件技术,不用缓冲,不用读写文件,没有读写重试,6-13S,传统的读写20-24S
HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,FileSize.HighPart,FileSize.LowPart,NULL);
char* pAddr =0;//映射起始地址
while(HandleFileSize.QuadPart<FileSize.QuadPart)
{
if (LeftFileSize.QuadPart<MapSize)MapSize = LeftFileSize.QuadPart;
//映射一段数据,返回这段数据的起始地址
pAddr = (char*)MapViewOfFile(hFileMap,FILE_MAP_WRITE,HandleFileSize.HighPart,HandleFileSize.LowPart,MapSize);
for (int i=0;i<MapSize;i++)
{
//像操作内存数组一样操作文件数据
(*(pAddr+i))++;//加密处理
}
HandleFileSize.QuadPart+=MapSize;
LeftFileSize.QuadPart-=MapSize;
//FlushViewOfFile(pAddr,MapSize);//不必时刻刷,让系统自己慢慢的写回去,提高性能
UnmapViewOfFile(pAddr);//解映射,这样可以映射到下一段
}
//关闭句柄
CloseHandle(hFile);
CloseHandle(hFileMap);
}
相关资讯