[Haskell-beginners] how to read file with locking
Jimmy Wylie
jwylie at uno.edu
Sat Oct 9 21:40:11 EDT 2010
On 10/9/10 5:49 PM, Joey Hess wrote:
> The function below always returns "", rather than the file's contents.
> _Real World Haskell_ touches on how laziness can make this problimatic,
> without really giving a solution, other than throwing in a putStr to
> force evaluation, which can't be done here. How can I make hGetContents
> strict, to ensure the file contents are really read before it gets closed?
>
> readFile' file = do
> f<- openFile file ReadMode
> -- locking will go here
> s<- hGetContents f
> hClose f
> return s
>
Haskell won't actually read the file unless you need the contents of the
file. In order to ensure that the file contents are read before it gets
close, you need to actually perform an operation that will force
evaluation of the file. Haskell will read the file then to perform
whatever operation you specify.
for example
sendFile file = do
f<- openFile file ReadMode
s <- hGetContents f
sendToNetwork s --made up function
hClose f
In your example, you're getting "" because the handle is closed, so
Haskell doesn't have anything to read.
You say you can't use putStr in this scenario, but if you're reading the
file you must be doing something with the contents. Wait to close the
handle until after that operation takes place.
> Also, I noticed that opening a file and locking it involves a
> very verbose seeming dance. (It's 2 lines of code in most other languages.)
> Does this indicate that few people bother with file locking in Haskell
> and so it still has these rough edges, or that there's a better way to do
> it that I have not found yet?
>
> openLocked file = do
> handle<- openFile file ReadMode
> lockfd<- handleToFd handle -- closes handle
> waitToSetLock lockfd (ReadLock, AbsoluteSeek, 0, 0)
> handle'<- fdToHandle lockfd
> return handle'
>
You should go to haskell.org/hoogle, and search openFile, or check out
the Haskell98 report, but I'm under the impression that ghc locks the
file for you when you open the file.:
From haskell98 report:
21.2.3 File locking
Implementations should enforce as far as possible, at least locally to
the Haskell process, multiple-reader single-writer locking on files.
That is, /there may either be many handles on the same file which manage
input, or just one handle on the file which manages output/. If any open
or semi-closed handle is managing a file for output, no new handle can
be allocated for that file. If any open or semi-closed handle is
managing a file for input, new handles can only be allocated if they do
not manage output. Whether two files are the same is
implementation-dependent, but they should normally be the same if they
have the same absolute path name and neither has been renamed, for example.
21.3.1 Opening Files
...
/Error reporting/: the openFile computation may fail with
isAlreadyInUseError if the file is already open and cannot be reopened;
isDoesNotExistError if the file does not exist; orisPermissionError if
the user does not have permission to open the file
Hope this helps,
Jimmy Wylie
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20101009/d3bd5364/attachment.html
More information about the Beginners
mailing list