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

new*_*ser 2 io haskell file lazy-evaluation

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

saveFile content path = do
        writeFile path (show content)
Run Code Online (Sandbox Code Playgroud)

为什么?

Don*_*art 8

从你的问题,看来你正在使用readFilewriteFile来自System.IO于同一个文件.

请记住,这System.IO.readFile懒惰的,这意味着最初打开文件句柄,然后当程序需要数据时,将读取片段.只有在读取了所有数据或删除了对文件的所有引用后,才会关闭文件句柄.在此之前资源已被锁定.

您需要确保在尝试写入文件之前完全读取文件,或者以某种方式关闭文件.实现此目的的一种简单方法是使用严格的IO.例如,:

loadFileStrict :: Read a => FilePath -> IO a
loadFileStrict f = do
    s <- readFile f
    length s `seq` return s
Run Code Online (Sandbox Code Playgroud)

在这里,我们在返回结果之前询问字符串的长度.这会强制读取整个内容.

此模式在严格的包中捕获.