Каков наилучший способ получить размер файла в haskell? - PullRequest
8 голосов
/ 11 апреля 2011

Мне интересно, как получить размер файла в haskell с наименьшими затратами.Прямо сейчас у меня есть следующий код:

getFileSize :: FilePath -> IO Integer
getFileSize x = do
handle <- openFile x ReadMode
size <- hFileSize handle
hClose handle
return size

Это кажется довольно медленным.Я наткнулся на getFileStatus в System.Posix.Files, но не знаю, как это работает - по крайней мере, я получаю ошибки только при игре с ним в ghci.Кроме того, я не уверен, будет ли это работать в Windows (возможно, нет).

Итак, еще раз повторю: каков наилучший (и независимый от платформы) подход для получения размера файла в Haskell?

Ответы [ 4 ]

10 голосов
/ 11 апреля 2011

То, что вы хотите, - это, действительно, getFileStatus и fileSize, оба из System.Posix (которые будут отлично работать под Windows, учтите). Использование выглядит следующим образом, оставляя обработку ошибок до вас:

getFileSize :: String -> IO FileOffset
getFileSize path = do
    stat <- getFileStatus path
    return (fileSize stat)

Для чего это стоит, и хотя я думаю, что это менее читабельно, вы можете сократить эту форму до:

getFileSize path = getFileStatus path >>= \s -> return $ fileSize s
8 голосов
/ 11 апреля 2011

Я не знаю, есть ли лучший способ. RWH поставляет свою собственную оболочку для hFileSize:

getFileSize path = handle (\_ -> return Nothing) $
  bracket (openFile path ReadMode) hClose $ \h -> do
    size <- hFileSize h
    return (Just size)

Также отмечается, что доступен unix-compat , который «обеспечивает переносимые реализации частей пакета unix».

1 голос
/ 09 апреля 2016
import System.Posix.Files
import System.Posix.Types

getFileSize :: FilePath -> IO FileOffset
getFileSize path = fmap fileSize $ getFileStatus path
0 голосов
/ 17 сентября 2015

Кажется, что System.Posix.Files не работает в Windows (кроме Cygwin), вы пробовали unix-compat?

https://hackage.haskell.org/package/unix-compat-0.4.1.4/docs/System-PosixCompat-Files.html

Это сработало для меня на моей машине с Windows 10:

> cabal install unix-compat
Resolving dependencies...
... lots of output, plus I had to put Cygwin on my path to make it build ...
> ghci
Prelude> import System.PosixCompat.Files
Prelude System.PosixCompat.Files> getFileStatus ".bashrc">>= \s -> return $ fileSize s
5764
...