2

Delphi 2006でTFileStreamを使用しています。範囲外のオフセットを使用してTFileStream.Seekを呼び出すと、異なる戻り値が返されます。ストリームの先頭より下の位置をシークすると、関数は-1を返し、ストリームサイズを超えてシークすると、この関数は、ストリームがそれほど大きい場合のストリーム内の位置を返します。ストリームでのシーク操作が成功したかどうかを確認する方法はありますか?シークオフセットが現在のストリームサイズの範囲外である場合、TFileStream.Seekが失敗しないのはなぜですか?

前もって感謝します。

4

2 に答える 2

2

はい、ファイルサイズを超えてシークできます。ここでエラーがない場合、シークは成功します。それ以上に、ファイルサイズを超えてファイル領域(LockFileを参照)をロックできます。これもOKであり、一部のRDBMSがテーブル/レコードのロックを実装するために使用します。

また、MSDNから:

ファイルポインタをファイルの終わりを超えた位置に設定することはエラーではありません。SetEndOfFile、WriteFile、またはWriteFileEx関数を呼び出すまで、ファイルのサイズは増加しません。書き込み操作により、ファイルのサイズがファイルポインターの位置に書き込まれたバッファーのサイズを加えた値に増加し、その結果、間にあるバイトが初期化されなくなります。

したがって、ファイルサイズを超えてファイルポインタを設定することにより、後でファイルサイズを増やすことができます(たとえば、SetEndOfFileによって)。

于 2010-07-21T15:43:36.117 に答える
0

これはwindows関数を呼び出し、得られる結果はwindows関数からのものです。

Seek値が有効かどうか、コードをチェックインする傾向があります。これをたくさん行う必要がある場合は、TFileStreamの子孫を作成します。これは、TRangeCheckingFileStreamのように、seekメソッドに範囲チェックを含み、期待できる値を返します。

于 2010-07-21T15:50:04.587 に答える