Piszę demona, który czyta coś z małego pliku, modyfikuje go i zapisuje z powrotem do tego samego pliku. Muszę się upewnić, że każdy plik zostanie zamknięty zaraz po przeczytaniu, zanim spróbuję go napisać. Muszę również upewnić się, że każdy plik jest zamykany natychmiast po napisaniu, ponieważ czasami mogę od razu go odczytać.Zapewnianie zamykania plików natychmiast
Przyjrzałem się używaniu binary-strict zamiast binarnego, ale wydaje się, że tylko zapewnia ścisłe Get, a nie ścisłe Put. Taki sam problem z System.IO.Strict. I czytając binarnie ścisłą dokumentację, nie jestem pewien, czy naprawdę rozwiązuje mój problem polegający na tym, że pliki są natychmiast zamykane. Jaki jest najlepszy sposób, aby sobie z tym poradzić? DeepSeq?
Oto bardzo uproszczony przykład, który daje pojęcie o strukturze mojej aplikacji. Ten przykład kończy się z oczywistych powodów, gdy znika oczywisty problem.
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
Bezwstydna wtyczka: 'pipe' wkrótce wyjdzie z szybkim, deterministycznym i złożonym zarządzaniem zasobami w ciągu tygodnia. –
@GabrielGonzalez Excellent. Pinguj mnie, kiedy zostanie wydany, a ja zaktualizuję tę odpowiedź. –
Gotowe.Właśnie ogłosiłem to na [reddit] (http://www.reddit.com/r/haskell/comments/txkb0/pipes_20_pipe_finalization/). –