On Thu, 13 Aug 2009 21:46:23 +0200 (CEST) Michael Van Canneyt <mich...@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 _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal