Estoy escribiendo un daemon que lee algo de un archivo pequeño, lo modifica y lo vuelve a escribir en el mismo archivo. Necesito asegurarme de que cada archivo se cierra rápidamente después de leer antes de intentar escribir en él. También necesito asegurarme de que cada archivo se cierra inmediatamente después de escribir, porque de vez en cuando puedo leer de nuevo.Asegurar que los archivos se cierran rápidamente
He estudiado el uso de binary-strict en lugar de binary, pero parece que solo proporciona un Get estricto, no un Put estricto. Mismo problema con System.IO.Strict. Y al leer la documentación estrictamente binaria, no estoy seguro de que realmente resuelva mi problema de garantizar que los archivos se cierren rápidamente. ¿Cuál es la mejor manera de manejar esto? DeepSeq?
Aquí hay un ejemplo muy simplificado que le dará una idea de la estructura de mi aplicación. Este ejemplo termina con
*** Exception: test.dat: openBinaryFile: resource busy (file is locked)
por razones obvias.
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
Conector desvergonzado: 'pipes' está a punto de salir con una administración de recursos rápida, determinista y composable dentro de una semana. –
@GabrielGonzalez Excelente. Hazme ping cuando se haya lanzado y actualizaré esta respuesta. –
Ya está hecho.Acabo de anunciarlo en [reddit] (http://www.reddit.com/r/haskell/comments/txkb0/pipes_20_pipe_finalization/). –