[fpc-pascal] TFileStream.SetSize sometimes fails

Michael Van Canneyt michael at freepascal.org
Thu Aug 13 21:46:23 CEST 2009



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.

Why not simply remove/backup and subsequently recreate the file ?

Michael.



More information about the fpc-pascal mailing list