在haskell中检索文件大小的最佳方法是什么?

mar*_*rds 8 filesystems io haskell

我想知道如何以最少的开销获取haskell中文件的大小.现在我有以下代码:

getFileSize :: FilePath -> IO Integer
getFileSize x = do
handle <- openFile x ReadMode
size <- hFileSize handle
hClose handle
return size
Run Code Online (Sandbox Code Playgroud)

这似乎很慢.我偶然发现了System.Posix.Files中的getFileStatus,但不知道它是如何工作的 - 至少我在ghci中玩它时只会遇到错误.另外,我不确定这是否适用于Windows(可能不适用).

重申一下:在Haskell中获取文件大小的最佳(和平台无关)方法是什么?

Ken*_*kot 12

你想要的确是什么,getFileStatus并且fileSize都来自System.Posix(在Windows下可以正常工作,请注意).用法如下,让错误处理由你决定:

getFileSize :: String -> IO FileOffset
getFileSize path = do
    stat <- getFileStatus path
    return (fileSize stat)
Run Code Online (Sandbox Code Playgroud)

对于它的价值,虽然我认为它的可读性较差,但您可以将此表格缩短为:

getFileSize path = getFileStatus path >>= \s -> return $ fileSize s
Run Code Online (Sandbox Code Playgroud)

  • 您还可以将其缩短为`getFileSize path = fileSize <$> getFileStatus path`(如果您不使用`Control.Applicative`,则将`<$>`替换为`\`fmap \``;它们是同义词); 在(<.>)`中由`let(f <.> g)x = f <$> gx定义的函数组成,这是`getFileSize = fileSize <.> getFileStatus`.我认为这两种形式都是可读的,并且有很短的优点. (9认同)
  • 刚试过这个,在Windows 8上,"System.Posix"不起作用. (3认同)
  • @chomp你介意解释为什么System.Posix也适用于Windows吗?我认为Posix是一个典型的东西,除非你使用cygwin或其他东西,不能在Windows上工作. (2认同)
  • @Tarrasch,我确信这取决于(Haskell)库的实现,但是Microsoft的标准运行时库已经有一段时间了(因为旧版本的NT,IIRC)提供了大多数(全部?)POSIX.1的实现. ,其中包括"stat"和相关实用程序.请参阅例如:http://msdn.microsoft.com/en-us/library/14h5k7ff(v = vs.80).aspx (2认同)

Dan*_*ton 8

我不知道是否有更好的方法.RWH提供它自己的包装,以hFileSize:

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

它还指出unix-compat是可用的,它"提供了unix软件包部分的可移植实现".

  • 怎么样只是`withFile路径ReadMode hFileSize` (8认同)