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