深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 488|回复: 2
打印 上一主题 下一主题

TMemorystream处理大文件的异常

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2022-7-16 14:10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


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.
回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
 楼主| 发表于 2022-7-16 14:25:11 | 只看该作者
//二进制存文件
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;


回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
板凳
 楼主| 发表于 2022-7-16 14:40:44 | 只看该作者
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;

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 00:26 , Processed in 0.034214 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表