On Fri, Jul 13, 2007 at 07:59:22PM +0100, Andrew Coppin wrote: > Stefan O'Rear wrote: >> The problem is that you're closing the file twice. When you call any >> function of the getContents family, you assign to that function the >> responsibility to close the file, no sooner than it is no longer needed. >> Don't call hClose yourself, Bad Things will happen. >> > > Care to elaborate on "bad things"? (I.e., will this just crash the program > with an error, or will it do something more serious?) I must admit, I > thought closing such a file was simply no-op.
If you close the file, the stream will suddenly end. I believe silent data corruption is worse than a crash :) (currently, hGetContents also truncates on I/O error, but that's much less common and syslog will tell you about it anyway) > I can't remember why exactly, but somewhere or other I wrote some code that > does this. (Basically I want to shut the file without reading all of it, so > I can reopen it and start reading from the beginning again.) Is there a > sane way to do this? Or am I going to have to start playing with explicit > reads and writes? (Obviously I could just hang on to *all* of the input > stream returned from getContents - but that could be quite large. The > current way gives me low memory usage...) Did you actually try it? getContents is *lazy*. it doesn't read any more of the file than it has to. If it read the whole file immediately, you obviously DO need the whole file. This is also why closing a file after getContentsing it is Bad - getContents can't keep reading after you've closed the handle. Stefan
signature.asc
Description: Digital signature
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
