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

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

VBScript代码
  1. '==========================================================================   
  2. ' NAME  :   VBScript Control Photoshop 9.0 CS2   
  3. ' AUTHOR :   淡月清风 QQ:259177377 E-Mail:dgx_lsyd3@163.com   
  4. ' DATE   :   2007年4月20日23:22:43   
  5. ' COMMENT :  几个函数已经写出来,直接调用即可   
  6. ' VERSION : 1.0  
  7. '==========================================================================   
  8. Const psPixels=1   '设置Photoshop的单位是像素   
  9.   
  10. Set fso=CreateObject("Scripting.FileSystemObject")   
  11. Set PhotoshopApp=CreateObject("Photoshop.Application")   
  12. InitPhotoshop PhotoshopApp   
  13. ResizeImage PhotoshopApp,GetAppDirectory()+"现在的.jpg",1200,1600,96   
  14. ExitPhotoshop PhotoshopApp   
  15.   
  16.   
  17. '//初始化Photoshop   
  18. Sub InitPhotoshop(oPhotoshop)   
  19.  oPhotoshop.Preferences.RulerUnits=psPixels '设置默认单位为像素   
  20.  Do While oPhotoshop.Documents.Count   '关闭所有已打开的文档   
  21.   oPhotoshop.ActiveDocument.Close   
  22.  Loop  
  23. End Sub  
  24.   
  25. '//修改图片大小   
  26. Sub ResizeImage(oPhotoshop,ImageFilePath,nWidth,nHeight,nResolution)   
  27.  If fso.FileExists(ImageFilePath) Then  
  28.   oPhotoshop.Open(ImageFilePath) '打开图片   
  29.   Set oDocument=oPhotoshop.Documents.Item(1)   
  30.   oDocument.ResizeImage nWidth,nHeight,nResolution,3    
  31.   '参数依次为:宽,高,分辨率(比如96像素/英寸),采样类型   
  32.   oDocument.Save   
  33.   oDocument.Close   
  34.  End If  
  35. End Sub  
  36.   
  37. '//退出Photoshop   
  38. Sub ExitPhotoshop(oPhotoshop)   
  39.  PhotoshopApp.Quit   
  40. End Sub  
  41.   
  42. '//取得当前脚本文件所在的目录   
  43. Function GetAppDirectory()   
  44.  GetAppDirectory=Replace(WScript.ScriptFullName,WScript.ScriptName,"")   
  45. End Function  

 仅当做是抛砖引玉,呵呵
 具体可参考Photoshop 官方的参考手册:http://www.adobe.com/devnet/photoshop/scripting/

《VisualBasicReferenceGuide.pdf》   
《PhotoshopScriptingGuide.pdf》   
《JavaScriptReferenceGuide.pdf》 


本文链接地址: VBScript 编程控制 Photoshop
https://blog.qingfengju.com/index.asp?id=7

分类:脚本编程 查看次数:8922 发布时间:2009/4/20 23:28:10