[fpc-devel] TBufferedFileStream

José Mejuto joshyfun at gmail.com
Sun Sep 4 14:29:07 CEST 2016


El 04/09/2016 a las 14:04, Michael Van Canneyt escribió:

>> The second powerful reason is that I was not aware about TBufStream :)
> It's even documented.
> http://www.freepascal.org/docs-html/current/fcl/bufstream/index.html

Hello,

Sure :) But I'm not aware about all the gems in fpc code :)

>> TBufStream does support seek ? And SetSize ?
> Seek: yes. Setsize not.

I was asking looking at code:

function TWriteBufStream.Seek(const Offset: Int64; Origin: TSeekOrigin): 
Int64;
begin
   if (Offset=0) and (Origin=soCurrent) then
     Result := FTotalPos
   else
     BufferError(SErrInvalidSeek);
end;

Maybe I'm missing something ?

On the SetSize side I think there is a missing check, SetSize can make 
the file smaller, so think in a 1 Kb file, you read the first byte so 
the buffer will be filled with the 1 Kb data, now you SetSize to 1 byte 
and read another byte, this read will return 1 byte success read which 
is out of the bounds of the file.
I know this is a terrible border case and the solution could be just 
invalidate buffer when a SetSize is called.

> The TBufStream class has 2 descendents: one for reading, one for writing.
> This means the implementation is much more simple, and for most
> usecases, this is sufficient.

That's more or less what I was using in other programs, with my own 
class (I should read more docs).

>> My code like TBufStream inherits from TStream. Which is the advantage
>> of inherit from TOwnerStream ?
> TOwnerStream is only useful if you have a second stream which you use as a
> source. It will free it for you. This is useful when chaining streams.

Oh! I see, I'm using the typical Create(Stream,Owned=true)

> I will add your implementation to the bufstream unit. It offers more
> functionality, but works only on files.
>
> It's - as usual - a tradeoff.

Not exactly, it is possible to add my original implementation 
TCacheStream which works over any TStream and create a 
TBufferedFileStream (for Delphi compat.) inheriting from it, but it will 
not have the same inheritance chain.

What's the best for fpc ? A generic stream cache, a inheritance 
compatible TBufferedFileStream ? Or maybe both ? Or None ? :)

-- 




More information about the fpc-devel mailing list