Обеспечение быстрого закрытия файлов

Я пишу демон, который читает что-то из небольшого файла, модифицирует его и записывает обратно в тот же файл. Мне нужно убедиться, что каждый файл закрывается сразу после чтения, прежде чем я попытаюсь записать в него. Мне также нужно убедиться, что каждый файл закрывается сразу же после записи, потому что иногда я могу сразу же прочитать его снова.

Я рассматривал вариант использования 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
9
задан Greg Bacon 9 May 2012 в 14:32
поделиться