16,743
社区成员




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;
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;
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;