我正在学习Haskell Lazy IO.
我正在寻找一种优雅的方式来复制大文件(8Gb),同时将复制进度打印到控制台.
请考虑以下以静默方式复制文件的简单程序.
module Main where
import System
import qualified Data.ByteString.Lazy as B
main = do [from, to] <- getArgs
body <- B.readFile from
B.writeFile to body
Run Code Online (Sandbox Code Playgroud)
Imgine有一个你想用于报告的回调函数:
onReadBytes :: Integer -> IO ()
onReadBytes count = putStrLn $ "Bytes read: " ++ (show count)
Run Code Online (Sandbox Code Playgroud)
问题:如何将onReadBytes函数编织到Lazy ByteString中,以便在成功读取时调用它?或者如果这个设计不好,那么Haskell的做法是什么?
注意:回调的频率并不重要,可以每1024字节或每1Mb调用一次 - 不重要
答案:非常感谢camccann的答案.我建议完全阅读.
Bellow是基于camccann代码的代码版本,您可能会发现它很有用.
module Main where
import System
import System.IO
import qualified Data.ByteString.Lazy as B
main = do [from, to] <- getArgs
withFile from ReadMode $ …Run Code Online (Sandbox Code Playgroud)