2013-10-08 64 views
3

如何使用這個package或其他一些軟件包以及如何修復這段代碼來使用懶惰,所以它不會下載整個文件,而只是第一個字節?Haskell:使用Curl進行懶惰下載

import qualified Data.ByteString.Lazy as B 
import Network.Curl.Download.Lazy 

main = do 
    Right body <- openLazyURI "http://www.haskell.org/ghc/dist/7.6.3/ghc-7.6.3-x86_64-unknown-linux.tar.bz2" 
    return $ B.take 32 body 
+1

您無法控制下載量,只是下載很慢。它將以區塊形式下載,具體針對實現以及可能的網絡連接,但如果您使用的是懶惰變體,則應該返回一個懶惰的字節串,根據文檔。此代碼是否按預期工作? – bheklilr

+0

@bheklilr它像我說的那樣下載整個文件,然後它返回懶惰的字節串。我會很樂意控制至少大塊下載。 – swish

+0

仔細看看文檔,看起來這個庫中嚴格函數和惰性函數之間的區別是它們的返回類型,而不是它們的行爲。 'openLazyURI'函數返回一個懶惰的'ByteString',而'openURI'返回一個嚴格的字節串。如果你使用懶惰的'ByteString'或者嚴格的''ByteString'',這很可能會提供一個接口。 – bheklilr

回答

2

下應該做的伎倆:

import Network.Curl.Download 
import Network.Curl.Opts 

... 
Right body <- openURIWithOpts [CurlMaxFileSize 32] someUrl 
+0

這不完全是我所需要的,但我發現其他一些選項包括回調函數,可以解決我認爲的問題。 – swish

1

爲此,您可以使用HTTP的管道:

import Network.HTTP.Conduit 
import Data.Conduit 
import qualified Data.Conduit.Binary as CB 

main = withManager $ \m -> do 
    req <- parseUrl "http://www.haskell.org/ghc/dist/7.6.3/ghc-7.6.3-x86_64-unknown-linux.tar.bz2" 
    res <- http req m 
    responseBody res $$+- CB.take 32 

這樣做的優點是,有沒有偷懶I/O參與:所有的資源管理都是完全確定性的。

+0

謝謝,唯一的缺點是它只適用於http。 – swish

+0

你的意思是與https相對,或者與ftp相反?如果前者,http-conduit確實擁有完整的SSL支持,那麼你應該很好。 –