【发布时间】:2012-05-18 02:00:58
【问题描述】:
我正在编写一个守护程序,它从一个小文件中读取某些内容,对其进行修改,然后将其写回到同一个文件中。在尝试写入之前,我需要确保每个文件在阅读后立即关闭。我还需要确保每个文件在写入后立即关闭,因为我可能偶尔会立即再次读取它。
我研究过使用二进制严格而不是二进制,但似乎只提供严格的 Get,而不是严格的 Put。 System.IO.Strict 也有同样的问题。通过阅读二进制严格文档,我不确定它是否真的解决了我确保文件被及时关闭的问题。处理这个问题的最佳方法是什么?深度序列?
这是一个高度简化的示例,可让您了解我的应用程序的结构。这个例子以
结束*** 例外:test.dat: openBinaryFile: 资源繁忙(文件被锁定)
出于显而易见的原因。
import Data.Binary ( Binary, encode, decode )
import Data.ByteString.Lazy as B ( readFile, writeFile )
import Codec.Compression.GZip ( compress, decompress )
encodeAndCompressFile :: Binary a => FilePath -> a -> IO ()
encodeAndCompressFile f = B.writeFile f . compress . encode
decodeAndDecompressFile :: Binary a => FilePath -> IO a
decodeAndDecompressFile f = return . decode . decompress =<< B.readFile f
main = do
let i = 0 :: Int
encodeAndCompressFile "test.dat" i
doStuff
doStuff = do
i <- decodeAndDecompressFile "test.dat" :: IO Int
print i
encodeAndCompressFile "test.dat" (i+1)
doStuff
【问题讨论】: