如果文件存在或默认字符串,则获取文件内容

时间:2018-08-07 14:24:39

标签: haskell io

我检查了doesFileExist filePath但 我只有在文件存在的情况下才能使用handle <- openFile filePath ReadMode

或者当文件不存在时如何获取默认字符串?

getFileContent filePath = do
    handle <- openFile filePath ReadMode
    content <- hGetContents handle
    return content

main = do
    blacklistExists <- doesFileExist "./blacklist.txt"
    let fileContent = if not blacklistExists
            then ""
            else getFileContent "./blacklist.txt"

    putStrLn fileContent

2 个答案:

答案 0 :(得分:6)

赞:

import Control.Exception

getFileContentOrElse :: String -> FilePath -> IO String
getFileContentOrElse def filePath = readFile filePath `catch`
    \e -> const (return def) (e :: IOException)

main = getFileContentOrElse "" "blacklist.txt" >>= putStrLn

const _ (e :: IOException)位只是为了给e提供类型注释,以便catch知道要使用哪个Exception实例。

答案 1 :(得分:4)

我们可以如下解决编译器错误。问题在于getFileContentIO String,而""只是String。我们可以使用return :: Monad m => a -> m a将数据包装到例如IO中。

然后,当我们要打印IO String时,我们仍然需要“解开main携带的数据,因此我们可以将main = do blacklistExists <- doesFileExist "./blacklist.txt" fileContent <- if not blacklistExists then return "" else getFileContent "./blacklist.txt" putStrLn fileContent更改为:

v1.1.8

话虽如此,但上述内容并不十分“安全”。例如,在检查存在与打开文件之间,有人可能会删除文件。该文件也可能存在,但无法读取等。

因此,与“ P 发射”相比,使用“ E 更容易实现 A sk F 主动性( EAFP)”的方法,我们的目标是打开文件,如果出现问题,我们将返回空字符串,就像@DanielWagner所建议的那样。