vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
---------------------------------------------------------------------------------------
当StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0)数值很大时发现速度很慢很慢,请问如何解决?
有什么好的办法吗?
或者如果用文件流替代会不会好点,怎么用?
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
---------------------------------------------------------------------------------------
当StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0)数值很大时发现速度很慢很慢,请问如何解决?
有什么好的办法吗?
或者如果用文件流替代会不会好点,怎么用?
vMemoryStream.Size := rSize;
vMemoryStream.Position:=0;
vMemoryStream.CopyFrom(vFileStream,rSize);
...
下面的函数体有每次拷贝的大小:
MaxBufSize = $F000;
先读出到缓冲区,再拷贝到内存流,有两次动作.
所以文件比较小时无所谓,大时就很慢的原因
}
function TStream.CopyFrom(Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
var
BufSize, N: Integer;
Buffer: PChar;
begin
if Count = 0 then
begin
Source.Position := 0;
Count := Source.Size;
end;
Result := Count;
if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
GetMem(Buffer, BufSize);
try
while Count <> 0 do
begin
if Count > BufSize then N := BufSize else N := Count;
Source.ReadBuffer(Buffer^, N);
WriteBuffer(Buffer^, N);
Dec(Count, N);
end;
finally
FreeMem(Buffer, BufSize);
end;
end;vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.Size:=size;
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
中的:vFileStream.Memory从哪来?
vMemoryStream:=TMemoryStream.Create;
vFileStream:=TFileStream.Create(mFileName,fmOpenRead or fmShareDenyNone);
...
...
...
vMemoryStream.Clear;
vMemoryStream.Size:=size;
vFileStream.ReadBuffer(vMemoryStream.Memory^,size);
//CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大
//vMemoryStream.CopyFrom(vFileStream,StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0));
vMemoryStream.Position:=0;
rSize := StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0);
vMemoryStream.setsize(rSize);//加上这句
vMemoryStream.CopyFrom(vFileStream,rSize);
vMemoryStream.Position:=0;谢谢二楼