本帖最后由 wankoilz 于 2013-5-12 11:46 编辑
昨天重新看了下《深入挖掘Windows脚本技术》(原文不知道是谁写的,网上到处都是)。
里面提到了vbs多线程下载,今天尝试写了一下。
话说还是闲来练手,初步实现了自己认为的“多线程”下载。(注意这里的引号,关于vbs与多线程请参考12楼链接)
为避免冗余,省了一些错误检查。我觉得没多大实际用途,有兴趣的兄弟一起学习讨论呗。欢迎大家指正: | | | | | url=InputBox("输入完整下载地址:") | | threadCount=InputBox("输入线程数(不超过10吧,太多就累赘了):") | | fileName=GetFileName(url) | | filePath=GetFilePath(WScript.ScriptFullName) | | Set ohttp=CreateObject("msxml2.serverxmlhttp") | | Set ado=CreateObject("adodb.stream") | | Set fso=CreateObject("scripting.filesystemobject") | | ado.Type=1 | | ado.Mode=3 | | ado.Open | | ohttp.open "Head",url,True | | ohttp.send | | Do While ohttp.readyState<>4 | | WScript.Sleep 200 | | Loop | | | | fileSize=ohttp.getResponseHeader("Content-Length") | | ohttp.abort | | | | fso.CreateTextFile(filePath&"TmpFile",True,False).Write(Space(fileSize)) | | ado.LoadFromFile(filePath&"TmpFile") | | | | blockSize=Fix(fileSize/threadCount):remainderSize=fileSize-threadCount*blockSize | | upbound=threadCount-1 | | | | | | Execute("Dim arrHttp("&upbound&")") | | For i=0 To UBound(arrHttp) | | startpos=i*blockSize | | endpos=(i+1)*blockSize-1 | | If i=UBound(arrHttp) Then endpos=endpos+remainderSize | | Set arrHttp(i)=CreateObject("msxml2.xmlhttp") | | arrHttp(i).open "Get",url,True | | | | arrHttp(i).setRequestHeader "Range","bytes="&startpos&"-"&endpos | | arrHttp(i).send | | Next | | Do | | WScript.Sleep 200 | | For i=0 To UBound(arrHttp) | | If arrHttp(i).readystate=4 Then | | | | ado.Position=i*blockSize | | MsgBox "线程"&i&"下载完毕!" | | ado.Write arrHttp(i).responseBody | | arrHttp(i).abort | | complete=complete+1 | | End If | | Next | | If complete=UBound(arrHttp)+1 Then Exit Do | | timeout=timeout+1 | | If timeout=5*30 Then | | | | MsgBox "30秒超时!" | | WScript.Quit | | End If | | Loop | | If fso.FileExists(filePath&fileName) Then fso.DeleteFile(filePath&fileName) | | fso.DeleteFile(filePath&"TmpFile") | | ado.SaveToFile(filePath&fileName) | | MsgBox "文件下载完毕!" | | | | Function GetFileName(url) | | arrTmp=Split(url,"/") | | GetFileName=arrTmp(UBound(arrTmp)) | | End Function | | | | Function GetFilePath(fullname) | | arrTmp=Split(fullname,"\") | | For i=0 To UBound(arrTmp)-1 | | GetFilePath=GetFilePath&arrTmp(i)&"\" | | Next | | End FunctionCOPY |
测试下载地址:http:COPY
|