Я пишу демон, который читает что-то из небольшого файла, модифицирует его и записывает обратно в тот же файл. Мне нужно убедиться, что каждый файл закрывается сразу после чтения, прежде чем я попытаюсь записать в него. Мне также нужно убедиться, что каждый файл закрывается сразу же после записи, потому что иногда я могу сразу же прочитать его снова.
Я рассматривал вариант использования binary-strict вместо binary, но кажется, что он обеспечивает только строгое Get, а не строгое Put. Та же проблема с System.IO.Strict. И, прочитав строгую бинарную документацию, я не уверен, что это действительно решает мою проблему обеспечения быстрого закрытия файлов. Как лучше всего справиться с этим? ДипСек?
Вот очень упрощенный пример, который даст вам представление о структуре моего приложения. Этот пример заканчивается на
*** Exception: test.dat: openBinaryFile: resource busy (file is locked)
по очевидным причинам.
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