我检查了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
答案 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)
我们可以如下解决编译器错误。问题在于getFileContent
是IO 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所建议的那样。