[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