BOOL SaveNewFile( IN LPCTSTR lpNewFilePath,IN PBYTE lpbData,IN DWORD dwFileSize )
{

HANDLE _w_hFile=INVALID_HANDLE_VALUE;
HANDLE _w_hFileMap=NULL;
PBYTE _w_lpbFile=NULL;

_w_hFile=CreateFile(
  lpNewFilePath,//路径
  GENERIC_WRITE|GENERIC_READ,//写
  0 ,//共享类型0
  NULL,//文件的安全特性
  Create_ALWAYS,//创建文件,会改写前一个文件
  FILE_FLAG_SEQUENTIAL_SCAN,//针对连续访问对文件缓冲进行优化
  NULL);//如果不为零,则指定一个文件句柄

if (INVALID_HANDLE_VALUE==_w_hFile)
{
  TRACE("CreateFile:GetLastError()=%d\n",GetLastError());
  return FALSE;
}

_w_hFileMap = CreateFileMapping(
 
_w_hFile, 
 
NULL, //安全对象
  PAGE_READWRITE,//以读写方式打开映射
  0,
  dwFileSize
,
  NULL);//指定文件映射对象的名字

if (NULL==_w_hFileMap)
{
  TRACE("CreateFileMapping:GetLastError()=%d\n",GetLastError());
  return FALSE;
}

_w_lpbFile = (PBYTE) MapViewOfFile(
  _w_hFileMap, 
 
FILE_MAP_WRITE,
  0,

  0, //映射的大小
  0);//零表示允许windows寻找地址

if (NULL==_w_lpbFile)
{
  TRACE("MapViewOfFile:GetLastError()=%d\n",GetLastError());
  return FALSE;
}
memcpy(_w_lpbFile,lpbData,dwFileSize);

//这个memcpy导致性能骤减为CFile::Write的水平,郁闷

if (!FlushViewOfFile(_w_lpbFile,0))
{
  TRACE("FlushViewOfFile:GetLastError()=%d\n",GetLastError());
  return FALSE;
}

UnmapViewOfFile(_w_lpbFile);
CloseHandle(_w_hFileMap);
CloseHandle(_w_hFile);
_w_hFile=INVALID_HANDLE_VALUE;
_w_hFileMap=NULL;
_w_lpbFile=NULL;

return TRUE;

}

性能测试:
P42.8双核+1G内存+希捷IDE接口80G硬盘,写入10M数据平均需要220毫秒!
#define SIZE 1024*1024*10
char *s=new char[
SIZE];//10M
SaveNewFile("test.bin",(PBYTE)s,
SIZE);


本文链接地址: 使用内存映射文件来快速保存数据到文件
https://blog.qingfengju.com/index.asp?id=6

上一篇: 常用的几个列车时刻表(安康-西安-徐州-深圳)
下一篇: VBScript 编程控制 Photoshop

分类:Win32/C++ 查看次数:8779 发布时间:2009/4/20 23:36:00