2010-07-21 83 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