openFile - 权限被拒绝 - 读取和写入同一文件时

时间:2011-05-21 12:40:06

标签: file haskell io lazy-evaluation

当我尝试写一些文件时,我有一个错误'openFile - permission denied':

saveFile content path = do
        writeFile path (show content)

为什么?

1 个答案:

答案 0 :(得分:8)

根据您的问题,您似乎在readFile使用同一档案中的writeFileSystem.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包中捕获。