二进制数据
同样我们考虑把这个功能封装在一个类里面。我们实现了一个叫TStreamIncise的类,在设计这个类时,我们为了更好的增加对这类要设计成什么样子进行了很好的讨论,首先我们模拟了如何使用该类。
for I := 0 to IncisedCount - 1 do
begin
StreamIncise.GetInciseStream(lStream); //获得分割流
ClientDataSet2.Append;
ClientDataSet2.FieldByName(''''F_ID'''').Value := I; //取序列号
ClientDataSet2.FieldByName(''''F_NAME'''').Value := FFileFullName;
ClientDataSet2.FieldByName(''''F_SERIAL'''').Value := I; // 取每次分割的序列号
lCompressionStream.CompressStream(lStream);
(ClientDataSet2.FieldByName(''''F_BINARY_DATA'''')
as TBlobField).LoadFromStream(lStream);
ClientDataSet2.Post;
end;
我们用代码估计了类的调用方式,通过这样的模拟代码我们获得了以下信息
1) 要获得文件的被分割数,就是说如果使用上面的模拟代码,我们必须先获得流的分割数。
2) TStreamIncise流在执行前先获得要处理流,同时设定分割块的大小。
如图:
我们用FInciseSize 来保存分割快的大小值,FStreamSize 保存流的大小值,FRemainSize保存每次分割后的剩余值。FInciseSize 在初始化函数 Create 中初始化。
FInciseSize := 50000; //设置分割的大小
LoadFromStream 把原始的流装载过来。
procedure TStreamIncise.LoadFromStream(stream: TMemoryStream);
begin
FMemoryStream := stream; // 保存一个流的引用
FStreamSize := stream.Size;
FRemainSize := FStreamSize;
end;
GetIncisedCount 获得装载的原始流要被分割的数量。
function TStreamIncise.GetIncisedCount: Integer;
begin
Result := FStreamSize div FInciseSize + 1;
end;
SetStreamDefault 用来把获得流设置到初始位置。
procedure TStreamIncise.SetStreamDefault;
begin
if Assigned(FMemoryStream) then FMemoryStream.Position :=0;
end;
核心的函数是GetInciseStream 通过调用它用户获得分割好后的流。
procedure TStreamIncise.GetInciseStream(inciseStream: TMemoryStream);
var
iMaxError: Integer;
Count: Integer;
Buffer: PChar;
begin
Count := GetBufferCount;
GetMem(Buffer, Count);
try
FMemoryStream.ReadBuffer(Buffer^, Count);
InciseStream.Clear;
inciseStream.WriteBuffer(Buffer^, Count);
InciseStream.Position := 0;
FRemainSize := FRemainSize - Count;
finally
FreeMem(Buffer);
end;
end;
这里GetBufferCount 每次返回分割块的大小,当剩余的流大小不够5000 时它返回剩下流的长度。
function TStreamIncise.GetBufferCount: Integer;
begin
Result := FInciseSize;
if FRemainSize < FInciseSize then
Result := FRemainSize;
end;
最终我们获得了一个可以这样调用的分割类:
procedure TForm1.Button8Click(Sender: TObject);
var
StreamIncise: TStreamIncise;
I: Integer;
lStream: TMem 上一页 [1] [2] [3] 下一页 没有相关教程
|