Actually, you need getFileStatus and fileSize , both from System.Posix (which will work fine on Windows if you use the unix-compat package instead of unix ). Usage is as follows, leaving error handling to your discretion:
 getFileSize :: String -> IO FileOffset getFileSize path = do stat <- getFileStatus path return (fileSize stat) 
Why is it worth it, and although I think it is less readable, you can shorten this form to:
 getFileSize path = getFileStatus path >>= \s -> return $ fileSize s