当我尝试写一些文件时,我有一个错误'openFile - permission denied':
saveFile content path = do
writeFile path (show content)
为什么?
答案 0 :(得分:8)
根据您的问题,您似乎在readFile
使用同一档案中的writeFile
和System.IO
。
请记住,System.IO.readFile
lazy ,这意味着最初打开文件句柄,然后在程序需要数据时,将读取片段。只有在读取了所有数据或删除了对文件的所有引用后,才会关闭文件句柄。在此之前,资源已被锁定。
在尝试写入文件之前,您需要确保文件已完全读取,否则以某种方式关闭文件。实现此目的的一种简单方法是使用严格的IO。 E.g,:
loadFileStrict :: Read a => FilePath -> IO a
loadFileStrict f = do
s <- readFile f
length s `seq` return s
在这里,我们在返回结果之前询问字符串的长度。这会强制读取整个内容。
此模式在strict包中捕获。