内存映射,快速读写文件
来源:互联网 发布:兴业淘宝联名信用卡 编辑:程序博客网 时间:2024/06/05 16:59
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;
- 内存映射,快速读写文件
- 文件内存映射mmap解决大文件快速读写问题
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- 使用内存映射文件读写大文件
- 使用内存映射文件读写大文件
- 使用内存映射文件读写大文件
- C\C++对大文件的快速读写(内存映射)
- 用内存映射读写大文件
- Windows的内存映射,大文件读写
- Linux C++内存映射方式读写文件
- 为什么内存映射要比IO读写更加快速
- 关于内存映射文件技术处理大文件的读写
- 关于内存映射文件技术处理大文件的读写
- 关于内存映射文件技术处理大文件的读写
- 关于内存映射文件技术处理大文件的读写
- 关于内存映射文件技术处理大文件的读写
- 关于内存映射文件技术处理大文件的读写
- 窗体上不能 完全显示标签的解决方法
- c++中__declspec用法总结
- java文件中为什么会有serialVersionUID
- 职业生涯中12个最致命的想法
- WinSocket模型的探讨——完成端口模型(一)
- 内存映射,快速读写文件
- ColdFusion
- 暴力进别人Q-Zone
- 从ERP到Netweaver到SaaS--看SAP的变身
- webservice 怎样返回一个自定义类
- vb遍历文件
- 内嵌汇编语法如下
- SQL中DATEADD和DATEDIFF的用法
- 如何处理心灵问题