谁告诉我高位文件跟低文件该怎么设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
内存映射文件超过了1G就不行了。我想分部分来做,可搞不定。麻烦会的朋友解决下
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
内存映射文件超过了1G就不行了。我想分部分来做,可搞不定。麻烦会的朋友解决下
解决方案 »
- 求救!!如何计算字符的排列和组合?????
- 送分:我想选中DBGIRD1中的一行,通过按钮的onclick 把它添加到另一个DBGIRD
- 数据库简单问题。
- dbtreeview的使用问题
- PARADOX表的排序问题 ! ----在线等待中
- 一个简单的函数问题?
- 还想问个问题,如何实现半透明菜单呢(不好意思拉)
- 一个消息的模糊问题,望详细回答
- form自动提交程序
- run的时候,出现这样的错误[Fatal Error] CX_Form.pas(9): File not found: 'TDataTimePicer.dcu',什么意思啊?请高手帮忙啊!
- 设置打开单元路径
- 用Wise打包基于SQL Server的数据库程序问题
------------------------
怎么會呢,記得內存映射大約可支持16EB的大小。
至於高低們的設置是,一個64位值中,较高的32位传递给参数dwFileOffsetHigh,较低的32位传递给参数dwMaximumSizeLow。
http://www.ai86.cn/book/windows_kernel/17.htm
FH:=FileOpen(Edit2.Text,fmOpenRead);
MH:=CreateFileMapping(FH,nil,Page_ReadOnly,0,FileSize,nil);
CloseHandle(FH);
MP:=MapViewOfFile(MH,File_Map_Read,0,0,FileSize); 这里返回的值为NIL了,
CloseHandle(MH);
Specifies the high-order 32 bits of the file offset where mapping is to begin. dwFileOffsetLow
Specifies the low-order 32 bits of the file offset where mapping is to begin. The combination of the high and low offsets must specify an offset within the file that matches the system's memory allocation granularity, or the function fails. That is, the offset must be a multiple of the allocation granularity. Use the GetSystemInfo function, which fills in the members of a SYSTEM_INFO structure, to obtain the system's memory allocation granularity.
---------------------------------
這兩個參數就是起始位置,dwNumberOfBytesToMap參數就是要映射的字節數量
----------------
已經很明白了,MapViewOfFile時,dwFileOffsetHigh 和dwFileOffsetLow 參數指定起始位置,dwNumberOfBytesToMap參數就是要映射的字節數量。
至於源碼,我也沒時間寫,如果你理論看懂了,不至於寫不出來的.
下面是我写的一段利用内存映射技术复制文件的代码,已经用一个3G多的文件测试通过,你可以参考一下.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;
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;
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;