Private
  svrstream:TMemoryStream;Procedure Formcreate()
begin
svrstream:=TMemoryStream.create;
end;Procedure WritetoStream(tempf:Array Of byte;RecevicefLength: Integer;)
begin
svrstream.write(tempf,RecevicefLength);//这里报错 EAccessViolation
if svrstream.size>= myStreamsize then //myStreamsize是事先收到的流的大小
  svrstream.savetofile(filename);
end;Procedure ServerSocketClientRead();
 var
  RceBuffer: Array[0..8191] Of byte;    {设置接收缓冲区}
  ReceviceLength: Integer;
begin
  ReceviceLength:= Socket.ReceiveLength;
  Socket.ReceiveBuf(RceBuffer, ReceviceLength);
  WritetoStream(RceBuffer,ReceviceLength);
end;这是我的一个上传文件的部分代码,其他肯定不会错。在第一次上传文件的时候不会错,第二次再上传一个文件的时候,就要报错EAccessViolation,本人对TMemoryStream不是太熟,不知道错在哪,望哪个高手指点一下。

解决方案 »

  1.   

    我声明了几个TMemoryStream它们都在Formcreate中Create;  svrstream:= TMemoryStream.Create;
      ClientSendStream:= TMemoryStream.Create;
      ServerSendStream:= TMemoryStream.Create;
    这应该没关系吧?
      

  2.   

    也会错啊!第一次文件保存完释放掉后,第二次上传也错
    真是奇怪啊,反正TMemoryStream第二次使用就有问题,比如还有一个过程是下载文件。TMemoryStream类型的ServerSendStream在formcreate已经create
    有一个过程是这样的
     Procedure sendfile()
    begin
     ServerSendStream.clear;//这里报错
     ServerSendStream.LoadFromFile(FileName);
    end;
    第一次执行时,也就是第一次下载一个文件时不会错,但第二次再执行时,就错了。我晕啊
      

  3.   

    MemoryStream的指针在每次上传时都重新定位为0
    即svrstream.position:=0试试看
      

  4.   

    把svrstream:=TMemoryStream.create;写到Procedure ServerSocketClientRead();的开头吧。
      

  5.   

    在那句话设断点,看看是什么变量被释放了,或者是tempf没有数据
      

  6.   

    SvrStream.Write(TempF, Length(TempF));

    SvrStream.Write(TempF[0], Length(TempF));试试~~
      

  7.   

    每次访问过后将svrstream.position:=0就不会有问题了