用内存映射的方法把一个文件加载进来没有问题。
但是,如果是个大文件,就会出错。
FFileHandle:=CreateFile(PChar(AFileName),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
FSize:=Windows.GetFileSize(FFileHandle,nil);
FMappingHandle:=CreateFileMapping(FFileHandle,nil,PAGE_EXECUTE_READWRITE,0,0,nil);
FMemory:=MapViewOfFile(FMappingHandle,FILE_MAP_READ,0,0,0);
if FMemory=nil then raise Exception.Create('FMemory=nil'); // 这里小文件不会成nil,大文件就是nil请教有能解决的吗?
但是,如果是个大文件,就会出错。
FFileHandle:=CreateFile(PChar(AFileName),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
FSize:=Windows.GetFileSize(FFileHandle,nil);
FMappingHandle:=CreateFileMapping(FFileHandle,nil,PAGE_EXECUTE_READWRITE,0,0,nil);
FMemory:=MapViewOfFile(FMappingHandle,FILE_MAP_READ,0,0,0);
if FMemory=nil then raise Exception.Create('FMemory=nil'); // 这里小文件不会成nil,大文件就是nil请教有能解决的吗?
映射大文件你要这么用MapViewOfFile(FMapHandle, FILE_MAP_READ,
OffsetHigh, OffsetLow, NumberOfBytesToMap);而不是都传入0
例如设定每次映射大小为50M,首先映射第一个50M,处理完后,映射第二个50M。
FileMapping本身支持offset的。