我正在编写一个守护进程,它从一个小文件中读取一些内容,对其进行修改,然后将其写回同一个文件。在尝试写入之前,我需要确保每个文件在阅读后立即关闭。我还需要确保每个文件在写入后立即关闭,因为我可能偶尔会立即再次读取它。
我已经研究过使用二进制严格而不是二进制,但似乎只提供严格的 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