深圳全飞鸿

标题: TMemorystream处理大文件的异常 [打印本页]

作者: zhgc    时间: 2022-7-16 14:10
标题: TMemorystream处理大文件的异常


procedure TForm1.Button1Click(Sender: TObject);
var
  fs:TMemorystream;
  t:dword;
begin
  t:=gettickcount;
  fs:=TMemorystream.Create;
  fs.Size:=int64(1024*1024*1024)*2;
  //FillChar(fs.memory^,fs.size,#$FF);
  fs.SaveToFile('c:\zz.bin');
  button1.Caption:=inttostr(gettickcount-t);
end;

如果大于1G就提示: Overflow in conversion or arithmetic operation
如果强制把大小设置为Int64时,编译不报错,但运行时报错:Range check error.

作者: zhgc    时间: 2022-7-16 14:25
//二进制存文件
function SaveFileByByteAr(AByteAr: TByteDynArray; AFileName: string): Boolean;
var
  LBuf: TMemoryStream;
begin
  Result  := false;
  LBuf := TMemoryStream.Create;
  try
    LBuf.SetSize(Length(AByteAr));
    Move(AByteAr[0], LBuf.memory^, Length(AByteAr));
    LBuf.Seek(0, soFromBeginning);
    LBuf.SaveToFile(AFileName);
    Result  := true;
  finally
    LBuf.Free;
  end;
end;

//流转二进制数据
function GetByteArByStream(AStream: TMemoryStream): TByteDynArray;
var
  Len: Integer;
begin
  Len := AStream.Size;
  SetLength(Result, Len);
  Move(AStream.Memory^, Result[0], Len);
end;



作者: zhgc    时间: 2022-7-16 14:40
procedure TForm1.Button2Click(Sender: TObject);
var
  fs:TMemorystream;
  t:dword;
  fn,fn2:string;
  F: file;
begin
  t:=gettickcount;
  fs:=TMemorystream.Create;
  fs.LoadFromFile(fn);
  AssignFile(F, fn2);
  Rewrite(F);
  BlockWrite(F, fs.memory ,fs.size);
  CloseFile(F);
end;






欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/) Powered by Discuz! X3.2