1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
import qualified System.IO.Posix.MMap.Lazy as L
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Internal as L
import qualified Data.ByteString.Internal as S
import qualified Data.ByteString as S
import Foreign.ForeignPtr
import System.Environment
import System.IO
import Control.Exception
main = do
[f,g] <- getArgs
writeFile' g =<< L.unsafeMMapFile f
--
-- An implementation of writeFile for bytestrings that
-- that finalises chunks as they go out the door.
--
writeFile' :: FilePath -> L.ByteString -> IO ()
writeFile' f txt = bracket (openBinaryFile f WriteMode) hClose (\hdl -> hPut hdl txt)
hPut :: Handle -> L.ByteString -> IO ()
hPut h cs = L.foldrChunks (\chunk rest -> do S.hPut h chunk
unmap chunk
rest)
(return ()) cs
where unmap c = finalizeForeignPtr fp where (fp,_,_) = S.toForeignPtr c
|