现在的位置: 首页 > 综合 > 正文

内存映射,快速读写文件

2013年09月10日 ⁄ 综合 ⁄ 共 2772字 ⁄ 字号 评论关闭

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;
 

【上篇】
【下篇】

抱歉!评论已关闭.