Reading/Deleting Last Line Of File

Jim Bufalini jim at visitrieve.com
Thu Feb 11 19:11:15 EST 2010


Alex Tweedly wrote:

> Jeff Massung wrote:
> > Warren,
> >
> > I've read through most of these suggestions, but I'm surprised that
> the
> > obvious hasn't been suggested yet (that I've seen): skip
> everything...
> >
> >
> Hasn't been suggested because it won't work.
> 
> > put the length of url "file:myfile.txt" into tEnd
> > open file "myfile.txt" for text update
> > seek to tEnd in file "myfile.txt"
> >
> > >From here just back up a "reasonable" number of characters... say
> 200. Find
> > the last CR character, nuke everything else and close the file.
> Didn't find
> > one? Try backing up another 200, etc. It'll be a whole lot faster.
> >
> >
> "... nuke everything else ...." ?? How ?
> You've opened the file for update, so anything that you write to the
> file *overwrites* any existing characters at the same position(s), and
> leaves everything following that unchanged. So there is no way to
> shorten a file if opened in update mode.
> 
> I *think* the best you can do is
> 
> 1. find file length (best to use the detailed files)
> 2. open for read, and read some chunk at the end (200, 1000, whatever
> ....)
>        (open for read is more efficient than open for update)
> 3. calculate the number of bytes to be deleted off the end of the file
> 4. close the file
> 5. open the file for append
> 6. write empty to the file at the appropriate point
> > Edge case to concern yourself with would be if your file happens to
> end with
> > a CR and maybe you want to ignore those cases. But that should be
> easy
> > enough to solve.
> >
> >
> Easiest (and I think best) way to resolve that corner case is to
> preserve the trailing CR if it's there to begin with, and not leave one
> if it wasn't there to start with. This happens to involve no extra work
> at all, hence it's the easiest one :-)
> 
> I decided it was time to email some (reasonably tested) revTalk rather
> than just ideas ....
> 
> (NB assumes that the defaultfolder has already been set to the
> appropriate place)
> > on deletelastline pFile
> >    constant K = 1000
> >    put the detailed files into t
> >    filter t with pFile & ",*"
> >    put item 2 of t into tFileLength
> >
> >    open file pFile for read
> >    seek to tFileLength-K in  file pFile
> >    read from file pFile until end
> >    close file pFile
> >
> >    put the number of chars in the last line of it into tNum
> >
> >    open file pFile for append
> >    write empty to file pFile at (tFileLength-tNum-3)
> >    close file pFile
> >
> >    end deletelastline
> -- Alex.

Just one thing Alex, you need to:

put URLDecode(the detailed files) into t

in case the file name has, for example, a space in it.

Aloha from Hawaii,

Jim Bufalini




More information about the Use-livecode mailing list