内存映射,快速读写文件

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;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值