【问题标题】:Delphi XE8 Datasnap Server returning and freeing TStreamDelphi XE8 Datasnap Server 返回和释放 TStream
【发布时间】:2015-10-23 12:24:03
【问题描述】:

我正在使用这个数据快照服务器方法来传输图像:

function TServerMethods.DownloadFile(sFilePath: string): TStream;
var
  strFileStream: TFileStream;
begin
  GetInvocationMetadata.ResponseContentType := 'image/jpeg';
  strFileStream := TFileStream.Create(sFilePath, fmOpenRead);
  Result := strFileStream;
end;

这工作正常,但似乎创建的流从未被释放!当我尝试删除文件时,我收到“文件正在使用错误”。当我返回一个自写的课程时,也是同样的问题;析构函数永远不会被调用。我必须启用某些东西吗?

【问题讨论】:

  • 你在什么平台上使用它?

标签: rest delphi memory-leaks datasnap


【解决方案1】:

这是我为修复它所做的,它是一种解决方法,但它至少可以工作。
1. 返回文件流的说明 我返回TStream,我使用修改函数IsFileInUse

    Files.IsFileInUse(path); //Check if file is used and try to free it

    fs := TFileStream.Create(path, fmOpenRead or fmShareDenyNone);
    fs.Position := 0;

    RecordSize := SizeOf(Measurements);
    StreamSize := fs.Size;
    j := (StreamSize div RecordSize) - 1;

    result := TMemoryStream.Create();

    for i := 0 to j do
    begin
      result.CopyFrom(fs, RecordSize);
    end;

    FreeAndNil(fs);

    //result := TFileStream.Create(path, fmOpenRead or fmShareDenyNone);
    result.Position := 0; 

2。在客户端应用程序上,第一次下载文件,但第二次出现异常。所以一定要在里面尝试 exc 尝试 exc 重复相同的调用 2 次。下载文件调用时看起来像 1 个调用 rase 异常,但它也释放了 Stream,因此每次调用第二个调用都有效。

  try
    try
      fs := TFileStream.Create(FilePath + RecordFileNameAPI, fmCreate);

  st := TMemoryStream.Create();
  st := APIClientModule.ServerMethodsBlob.getRecordingbyId(RecordFileNameAPI);
  st.Position := 0;

  RecordSize := SizeOf(Measurements);
  StreamSize := st.Size;
  j := (StreamSize div RecordSize) - 1;

  setlength(MeasurementArrayAPI, j + 1);

  // Copy Stream to memory object
  for i := 0 to j do
  begin
    st.Read(Measurements, RecordSize);
    MeasurementArrayAPI[i] := Measurements;
  end;

  // Copy Stream to File
  st.Position := 0;
  for i := 0 to j do
  begin
    fs.CopyFrom(st, RecordSize);
  end;

Except
  begin
    try
      FreeAndNil(fs);
      FreeAndNil(st);
      fs := TFileStream.Create(FilePath + RecordFileNameAPI, fmCreate);

      st := TMemoryStream.Create();
      st := APIClientModule.ServerMethodsBlob.getRecordingbyId(RecordFileNameAPI);
      st.Position := 0;

      RecordSize := SizeOf(Measurements);
      StreamSize := st.Size;
      j := (StreamSize div RecordSize) - 1;

      setlength(MeasurementArrayAPI, j + 1);

      // Copy Stream to memory object
      for i := 0 to j do
      begin
        st.Read(Measurements, RecordSize);
        MeasurementArrayAPI[i] := Measurements;
      end;

      // Copy Stream to File
      st.Position := 0;
      for i := 0 to j do
      begin
        fs.CopyFrom(st, RecordSize);
      end;
    Except
      exc := true;
    end;
  end;

end;

  finally  
    FreeAndNil(fs);  
    FreeAndNil(st);

if(not exc) then
begin
 //APIClientModule.ServerMethodsBlob.completeDownloding();

  if Assigned(FonGetLastRecordingDataAPIFinihed) then
    FonGetLastRecordingDataAPIFinihed();
end;


end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多