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)数值很大时发现速度很慢很慢,请问如何解决?
有什么好的办法吗?
或者如果用文件流替代会不会好点,怎么用?

解决方案 »

  1.   

    先分配好空间试试rSize := StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0);
    vMemoryStream.Size := rSize;
    vMemoryStream.Position:=0;
    vMemoryStream.CopyFrom(vFileStream,rSize);
    ...
      

  2.   

    {不要用CopyFrom这个函数,效率不高.
    下面的函数体有每次拷贝的大小:
    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; 
      

  3.   

    哦,忘了先分配内存了:
    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; 
      

  4.   

    上楼的:
    CopyMemory(vMemoryStream.Memory,vFileStream.Memory,size);//有可能要判断一下文件不能太巨大 
    中的:vFileStream.Memory从哪来?
      

  5.   

    还是没有解决,感觉非要用CopyFrom不可,不用根本没办法弄
      

  6.   

    听说这个NTFS磁盘的效率比fat32效率高好多倍。。
      

  7.   

    哦,忘了先分配内存了: 
    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;
      

  8.   

    解决了:
    rSize := StrToIntDef(StrRight(StrRight(vFileInfo[I],'|'),'|'), 0);
    vMemoryStream.setsize(rSize);//加上这句
    vMemoryStream.CopyFrom(vFileStream,rSize);
    vMemoryStream.Position:=0;谢谢二楼