2010-07-21 60 views
0

我正在使用tcl的http包下載文件列表,並想知道處理中斷的最佳方式是什麼。眼下大綱我下載的程序是這樣的:在Tcl中處理下載中斷

proc downloadFiles {url_list folder_location} { 
    foreach {i} $url_list { 
     regsub {.*/(.*)$} $i {\1} $name 
     set out [open $folder_location/$name w+] //not worried about errors here 
     if {[catch {set token [http::geturl $i -channel $out]}]} { 
      puts "Could not download $i" 
     } else { 
      http::cleanup $token 
      puts "Downloaded $i" 
     } 
     close $out 
    } 
} 

我有問題,該生產線是catch語句:

catch {set token [http::geturl $i -channel $out]} 

顯然,儘管我切斷了我的互聯網和停止下載一半catch語句仍然返回0表示錯誤。有沒有辦法解決這個問題?

回答

1

檢測網絡已經暫時消失是困難的(特意如此;這就是TCP/IP的工作方式,而HTTP恰好位於此之上)。你可以做的是嘗試從HTTP頭獲得預期的數據長度,並將其與實際接收到的數據長度進行比較(你需要爲此強制使用二進制模式,但是你可能無論如何都要處理二進制數據) 。

要獲得預期的數據長度和當前下載的長度,你需要一點魔法與upvar(內部別名,state,任意):

upvar #0 $token state 
puts "Content-Length was $state(totalsize), downloaded $state(currentsize)" 

不過請注意,許多網頁別t提供內容長度,因此totalsize字段爲零。 http包僅在這些情況下才知道它在達到最後時已經結束。

重新開始下載時,您需要發送一個Range標題。這不是一個明確的支持,所以你需要通過-headers選項geturl

http::geturl $url -headers [list Range bytes=$whereYouGotTo-] 

是的,格式確實很時髦。

+0

謝謝,工作得很好。 – NorthGuard 2010-07-23 16:29:04