这是我为修复它所做的,它是一种解决方法,但它至少可以工作。
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;