On 8/27/06, John Hughes <[EMAIL PROTECTED]> wrote:


> Hi, I use the operation 'readFile' for obtain information locates on
> a file. When I try to write another information on the same file, I
> obtain this error message: "openFile: permision denied". I found this:
> "The readFile operation holds a semi-closed handle on the file until
> the entire contents of the file have been consumed. It follows that an
> attempt to write to a file (using writeFile, for example) that was
> earlier opened by readFile will usually result in failure with
> isAlreadyInUseError." in this web
> http://www.haskell.org/onlinereport/io.html.
>
> How can I break that semi-closed handle for to write in the
> preaviously readed file? Thank you.

readFile returns an *unevaluated* list of characters from the file--as your
program needs those characters, so they will be read from the file. Once
they have all been read, then the file is closed.  So to ensure that the
file is closed, you just have to make sure your program reads all the
characters. One way is to count them. So here's a function that reads a
file, then rewrites it with "hello" added at the beginning:

addHello f = do
  s <- readFile f
  length s `seq` writeFile f ("hello"++s)

length s counts the characters in the file (forcing it all to be read), and
the `seq` is like a semicolon in C: it forces length s to be computed before
the writeFile is performed.

John

Thanks you for your code. I try with it and it works well, but I can
not use it in my aplication because I read the file in one function, I
compute the results with the readed information and, finally, I wrote
this results in another function (in this moment I do not have the
readed string, I have my structured data). How can I use this `seq`
with different functions?
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to