[fpc-pascal] TFileStream.SetSize sometimes fails

Mattias Gaertner nc-gaertnma at netcologne.de
Thu Aug 13 22:04:27 CEST 2009


On Thu, 13 Aug 2009 21:46:23 +0200 (CEST)
Michael Van Canneyt <michael at freepascal.org> 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 ?

I'm not sure if it is a kernel thing. I don't have a vbox to test.
That's why I ask. Maybe someone knows more.

 
> 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.

Yes. The code worked pretty well for years on many systems. But
you know the story of the ext4 bug. I hope this is not something like
that.

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

This will loose the access rights and type of the file.

Mattias



More information about the fpc-pascal mailing list