当我尝试将内容写入文件时,我遇到错误"打开文件 - 权限被拒绝":
saveFile content path = do
writeFile path (show content)
为什么?
从您的问题来看,您似乎在同一文件上使用readFile
和writeFile
来自System.IO
。
请记住,System.IO.readFile
是惰性的,这意味着文件句柄最初是打开的,然后随着程序需要数据,将读取片段。只有在读取了所有数据或删除了对文件的所有引用后,才会关闭文件句柄。在此之前,资源将被锁定。
在尝试写入文件之前,您需要确保文件已完全读取,或者以某种方式关闭文件。实现此目的的一种简单方法是使用严格的 IO。例如:
loadFileStrict :: Read a => FilePath -> IO a
loadFileStrict f = do
s <- readFile f
length s `seq` return s
在这里,我们在返回结果之前询问字符串的长度。这将强制读取整个内容。
此模式在严格包中捕获。