2015-10-23 68 views
1

我使用這個的DataSnap servermethod傳輸圖像:德爾福XE8 DataSnap服務器返回並釋放T流

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

該工程確定,但它似乎產生流永遠不會被釋放!當我嘗試刪除文件時,出現「文件正在使用錯誤」。當我返回一個自寫的類時,這是同樣的問題;析構函數永遠不會被調用。我必須啓用某些功能嗎?

+0

你在哪個平臺上使用它? –

回答

0

這就是我所做的修復它,它是解決方法,但它至少工作。返回文件流的
1. Instred我回到T流,我用的功能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.修改在客戶端應用程序第一次下載文件,但它堅持了例外第二次。因此,儘量不要嘗試重複同樣的呼叫2次。它看起來像下載文件調用1調用rase異常,但它也免費流,所以第二次調用每次工作。

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;