[fpc-pascal] TFileStream.SetSize sometimes fails

Michael Van Canneyt michael at freepascal.org
Fri Aug 14 20:34:40 CEST 2009



On Fri, 14 Aug 2009, Martin wrote:

> Michael Van Canneyt wrote:
>> On Thu, 13 Aug 2009, Mattias Gaertner wrote:
>>> I want to replace the content of an existing file (keeping the type and
>>> rights). I used:
>>> 
>>> fs := TFileStream.Create(Filename, fmOpenWrite or fmShareDenyNone);
>>> fs.Size := 0;
>>> fs.Write(.....);
>>> fs.Free;
>>> 
>>> But it does not always work. The line fs.Size does not clear the file on
>>> every file system. So the fs.Write only replaces the first part of the
>>> file.
>> If it depends on the filesystem, then you should complain with the linux
>> kernel people ?
>> 
>> Size=0 results in a ftruncate(Handle,0) call
>> Part of a strace (ex20 from the baseunix unit docs, fptruncate call)
>> 
>> open("test.dat", O_WRONLY|O_LARGEFILE)  = 3
>> ftruncate(3, 60)                        = 0
>> close(3)                                = 0
>> 
>> So we can state that FPC's ftruncate does work, it passes the args to the 
>> kernel.
>> If the kernel does not actually truncate the file, there is little FPC can 
>> do.
>
> Well the only case were it fails (at least were we know that it is truncate 
> that fails) is VBox shared folders. And indeed it seems they do have a bug. 
> http://www.virtualbox.org/ticket/3712
> or the one I can reproduce http://www.virtualbox.org/ticket/4771
>
> However in c I can specify
>  open(fname, O_WRONLY | O_TRUNC );
> which does work (bypasses the bug)
>
> I haven't seen an equvivalent to O_TRUNC in fpc ?

Sure there is:

uses baseunix;

Var
   H : integer;

begin
   h:=fpOpen(fname,O_WrOnly or o_trunk)
end.

But that is not relevant:
a) FPC itself should not work around kernel/vbox bugs.
b) It would not help in Mattias' case anyway...

Michael.



More information about the fpc-pascal mailing list