procedure 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;
var
t : longint;
begin
t := gettickcount();
MapMemoryFileCopy('C:/newdl.vct', 'c:/11.vct');
t := gettickcount() - t;
showmessage(inttostr(t));
end;