内存映射大文件

denglijun 2007-10-17 11:19:10
谁告诉我高位文件跟低文件该怎么设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
内存映射文件超过了1G就不行了。我想分部分来做,可搞不定。麻烦会的朋友解决下
...全文
511 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinglh 2008-01-11
  • 打赏
  • 举报
回复
收藏,还没有用过,学习
boblaw 2007-10-25
  • 打赏
  • 举报
回复
上面的代碼是錯誤的,再改一下貼上來
boblaw 2007-10-25
  • 打赏
  • 举报
回复
手工改了一下,沒有調試,不知道能否正常運行

procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
const
BufferSize=1024*1024*64;
var
SourceHandle:THandle; //源文件句柄
TargetHandle:THandle; //目标文件句柄
FSize:Cardinal; //文件低32位大小
HighSize:Cardinal; //文件高32位大小
TotalSize:int64; //文件總體積
sMapHandle:THandle; //源文件内存映射句柄
tMapHandle:Thandle; //目标文件内存映射句柄
PSource:Pointer; //源文件内存映射视图地址
PTarget:Pointer; //目标文件内存映射视图地址
StartPos:Int64;
MapSize:Cardinal;
begin
//源文件
SourceHandle:=fileopen(SourceFileName,fmOpenRead);
FSize:=GetFileSize(SourceHandle,@HighSize);
TotalSize:=HighSize*1024*1024*1024*4+FSize;
sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,0,TotalSize,nil);
CloseHandle(SourceHandle);
//目标文件
TargetHandle:=FileCreate(TargetFileName);
tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,0,TotalSize,nil);
CloseHandle(TargetHandle);

//初始化变量
StartPos:=0;
MapSize:=BufferSize;

while StartPos<TotalSize do
begin
if StartPos+BufferSize>TotalSize then
MapSize:=TotalSize-StartPos;
//创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,0,StartPos,MapSize);
PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,0,
StartPos,MapSize);
//复制
move(PByte(PSource)^,PByte(PTarget)^,MapSize);
StartPos:=StartPos+MapSize;
//取消内存映射视图
UnMapViewOfFile(PSource);
UnMapViewOfFile(PTarget);
end;
//关闭文件映射
CloseHandle(sMapHandle);
CloseHandle(tMapHandle);
end;

goldli 2007-10-25
  • 打赏
  • 举报
回复
关注!!!
denglijun 2007-10-25
  • 打赏
  • 举报
回复
我现在还不想结贴,但分一定给你,能帮我搞定高低位更是感谢了
denglijun 2007-10-25
  • 打赏
  • 举报
回复
上面的朋友辛苦了,如果能设置下高位文件那更好了。因为高低位我不知咋个设。我咋个设。就咋个出错
boblaw 2007-10-25
  • 打赏
  • 举报
回复
FSize:=GetFileSize(SourceHandle,@HighSize);
-----------------------------------
上面一行代码返回HighSize的值,对于一个大于4G的文件而言,GefFileSize只返回低32位的值,而高32位的值是通过第二个指针参数得来的.
QQ:540158372,白天一般不用的
denglijun 2007-10-25
  • 打赏
  • 举报
回复
HighSize 这个值是多少呀
denglijun 2007-10-25
  • 打赏
  • 举报
回复
黑马你的QQ多少,可以加你么,
boblaw 2007-10-25
  • 打赏
  • 举报
回复
剛才測試了一下,上面的程序OK,但是沒有用大於4G的文件測試,應該也是OK的
boblaw 2007-10-25
  • 打赏
  • 举报
回复
再修改了一下,有設置高位,但沒有調試過,LZ調試下,有問題再說。

procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
const
BufferSize=1024*1024*64;
var
SourceHandle:THandle; //源文件句柄
TargetHandle:THandle; //目标文件句柄
FSize:Cardinal; //文件低32位大小
HighSize:Cardinal; //文件高32位大小
TotalSize:int64; //文件總體積
sMapHandle:THandle; //源文件内存映射句柄
tMapHandle:Thandle; //目标文件内存映射句柄
PSource:Pointer; //源文件内存映射视图地址
PTarget:Pointer; //目标文件内存映射视图地址
StartPos:Int64;
MapSize:Cardinal;
function MakeInt64(high,low:Cardinal):int64;
begin
move(pchar(@high)^,pchar(longint(@result)+sizeof(cardinal))^,sizeof(cardinal));
move(pchar(@low)^,pchar(@result)^,sizeof(cardinal));
end;

function High32(num:int64):Cardinal;
begin
move(pchar(longint(@num)+sizeof(cardinal))^,pchar(@result)^,sizeof(cardinal));
end;

function Low32(num:int64):Cardinal;
begin
move(pchar(@num)^,pchar(@result)^,sizeof(cardinal));
end;
begin
//源文件
SourceHandle:=fileopen(SourceFileName,fmOpenRead);
FSize:=GetFileSize(SourceHandle,@HighSize);
TotalSize:=HighSize*1024*1024*1024*4+FSize;
sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,HighSize,FSize,nil);
CloseHandle(SourceHandle);
//目标文件
TargetHandle:=FileCreate(TargetFileName);
tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,HighSize,FSize,nil);
CloseHandle(TargetHandle);

//初始化变量
StartPos:=0;
MapSize:=BufferSize;

while StartPos<TotalSize do
begin
if StartPos+BufferSize>TotalSize then
MapSize:=TotalSize-StartPos;
//创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,High32(StartPos),Low32(StartPos),MapSize);
PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,
High32(StartPos),Low32(StartPos),MapSize);
//复制
move(PByte(PSource)^,PByte(PTarget)^,MapSize);
StartPos:=StartPos+MapSize;
//取消内存映射视图
UnMapViewOfFile(PSource);
UnMapViewOfFile(PTarget);
end;
//关闭文件映射
CloseHandle(sMapHandle);
CloseHandle(tMapHandle);
end;
denglijun 2007-10-25
  • 打赏
  • 举报
回复
晕了。。整个错误的给我,
wangxuelid 2007-10-24
  • 打赏
  • 举报
回复
帮,,,,,
boblaw 2007-10-24
  • 打赏
  • 举报
回复
上面的代码,没有设置高位,因此最多只能处理4G的文件
boblaw 2007-10-24
  • 打赏
  • 举报
回复
还没搞定吗?
下面是我写的一段利用内存映射技术复制文件的代码,已经用一个3G多的文件测试通过,你可以参考一下.

procedure TForm1.MapMemoryFileCopy(SourceFileName, TargetFileName: string);
const
BufferSize=1024*1024*64;
var
SourceHandle:THandle; //源文件句柄
TargetHandle:THandle; //目标文件句柄
FSize:Cardinal; //文件大小
sMapHandle:THandle; //源文件内存映射句柄
tMapHandle:Thandle; //目标文件内存映射句柄
PSource:Pointer; //源文件内存映射视图地址
PTarget:Pointer; //目标文件内存映射视图地址
StartPos:Cardinal;
MapSize:Cardinal;
begin
//源文件
SourceHandle:=fileopen(SourceFileName,fmOpenRead);
FSize:=GetFileSize(SourceHandle,nil);
sMapHandle:=CreateFileMapping(SourceHandle,nil,PAGE_READONLY,0,FSize,nil);
CloseHandle(SourceHandle);
//目标文件
TargetHandle:=FileCreate(TargetFileName);
tMapHandle:=CreateFileMapping(TargetHandle,nil,PAGE_READWRITE,0,FSize,nil);
CloseHandle(TargetHandle);

//初始化变量
StartPos:=0;
MapSize:=BufferSize;

while StartPos<FSize do
begin
if StartPos+BufferSize>FSize then
MapSize:=FSize-StartPos;
//创建映射视图,获得的PSource和PTarget指针,可以和操作普通指针一样进行内存操作
PSource:=MapViewOfFile(sMapHandle,FILE_MAP_READ,0,StartPos,MapSize);
PTarget:=MapViewOfFile(tMapHandle,FILE_MAP_READ or FILE_MAP_WRITE,0,
StartPos,MapSize);
//复制
move(PByte(PSource)^,PByte(PTarget)^,MapSize);
StartPos:=StartPos+MapSize;
//取消内存映射视图
UnMapViewOfFile(PSource);
UnMapViewOfFile(PTarget);
end;
//关闭文件映射
CloseHandle(sMapHandle);
CloseHandle(tMapHandle);
end;
denglijun 2007-10-23
  • 打赏
  • 举报
回复
哎,怎么这么搞定这个这么难呀,回答的人这么少,继续呀,帮忙搞定呀
denglijun 2007-10-21
  • 打赏
  • 举报
回复
没人顶,,还没搞定。继续呀
denglijun 2007-10-20
  • 打赏
  • 举报
回复
痛苦,如果字结数能随便,那到是好做,可还要什么32位,头大
denglijun 2007-10-19
  • 打赏
  • 举报
回复
假如我一次映射600M 又要怎样从600M那个位置开始呢?
denglijun 2007-10-19
  • 打赏
  • 举报
回复
哥们,咋个整,,随便定大小都可以么
加载更多回复(11)

16,743

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧