System.Classes.TStream.Size
Delphi
property Size: Int64 read GetSize write SetSize64;
C++
__property __int64 Size = {read=GetSize, write=SetSize64};
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
property | public | System.Classes.pas System.Classes.hpp |
System.Classes | TStream |
説明
ストリームのサイズをバイト数で示します。
Size を使用して、ストリームのサイズを知ることができます。Size は、ストリームに対して読み書きを行うルーチンで内部的に使われます。TStream の Size プロパティを設定しても何も起きません。ただし、TStream の下位クラスでこのプロパティをオーバーライドして、ストリームを使ってアクセスするリソースのサイズをアプリケーションで変更できるようにすることは可能です。
通常、Size プロパティはストリームのサイズをバイト数で示します。ただし、TStream の下位クラスでは、サイズが不明であることを -1
を使って示すことができます。サイズが不明な場合には、TStream.Read の戻り値を使ってストリームの終わりを判断してください。
DataSnap および DBX を使用する場合のストリーム サイズの例
DataSnap ストリームをブロック単位で読み取っている場合、実際にストリームの読み取りに使われる TStream の下位クラスは TDBXStreamReaderStream です。TDBXStreamReaderStream では、System.Classes.TStream.GetSize メソッド(Size プロパティのリーダー)などの TStream のメソッドをオーバーライドしています。
DBX 接続ではブロック単位でのストリームの読み取りをサポートしています。デフォルトのブロック サイズは 32 KB です。ストリームは、クライアントからサーバーへ、あるいはサーバーからクライアントへと渡すことができます。受信側(クライアントであるかサーバーであるかを問いません)がストリームを読み取るときには、ストリームは送信側から受信側へブロック単位で渡されます。複数のブロックに分けて読み取る必要があるほどストリームのサイズが大きい場合、受信側のストリームの Size プロパティは -1 になり、ストリームのサイズが不明であることを示します。受信側がストリームを読み取ると、DataSnap は必要に応じて送信側に次のブロックを要求します。ストリームを読み取るには、クライアントで、戻り値が要求した値よりも小さくなるまで Read() メソッドを呼び出します。
以下のコードは、Read() の戻り値を確認しながらストリームを最後まで読み取る方法を示しています。
var
LBuffer: TArray<Byte>;
LReadCount: Integer;
begin
SetLength(LBuffer, 1024*10); // 10K buffer for this example. The buffer size can be larger or smaller.
repeat
LReadCount := AStream.Read(LBuffer[0], Length(LBuffer));
if LReadCount > 0 then
begin
// Process buffer
end;
until LReadCount < Length(LBuffer);
関連項目
コード例