小さなファイルから何かを読み取り、それを変更して、同じファイルに書き戻すデーモンを書いています。書き込んだ後、書き込もうとする前に、各ファイルがすぐに閉じられることを確認する必要があります。また、ファイルをすぐに再度読み取る場合があるため、書き込み後すぐに各ファイルが閉じていることを確認する必要もあります。
バイナリの代わりにbinary-strictを使用することを検討しましたが、厳密なGetのみを提供し、厳密なPutは提供しないようです。System.IO.Strictと同じ問題。そして、binary-strictのドキュメントを読んだことから、ファイルがすぐに閉じられるようにするという私の問題が本当に解決されるかどうかはわかりません。これを処理するための最良の方法は何ですか?DeepSeq?
これは、私のアプリケーションの構造のアイデアを与える非常に単純化された例です。この例はで終了します
***例外: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