
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