?? down.vb
字號:
Public Class Down
Private dd As Int32 ' 記錄已下載接受到的數據量
Private st As Boolean
Dim myReq As Net.HttpWebRequest ' 發出網絡資源請求
Dim myRep As Net.HttpWebResponse ' 接受服務器響應
Dim ReadBytes As Int16 = 4095
Dim Dtd As Threading.Thread ' 工作線程
Public Property inds() As Int32
Get
inds = dd
End Get
Set(ByVal Value As Int32)
dd = Value
End Set
End Property
Public Sub New()
inds = -1
End Sub
Sub Start_down()
Dtd = New Threading.Thread(AddressOf Starts)
If dd < 0 Then Exit Sub
Try
st = False
Dtd.Start()
Catch ex As Exception
MessageBox.Show("下載任務啟動錯誤,請重新啟動!", "MobileAnt Demo")
End Try
End Sub
Sub Stop_down()
st = True
End Sub
Private Sub Starts()
If dd < 0 Or dd > JOBS.GetUpperBound(1) Then
MessageBox.Show("程序發生錯誤,請重新啟動!", "MobileAnt Demo")
dd = -1
Exit Sub
End If
Dim LAST_size As Int32 = JOBS(FileSizeOk, dd)
JOBS(logs, dd) = ""
'Dim pp As Net.IWebProxy
Dim i As Int32
'''''''''''''''''''''''''''
Dim UU As Uri = Nothing
Try
UU = New Uri(JOBS(URL, dd))
Catch ex As Exception
End Try
Try
myReq = CType(Net.WebRequest.Create(UU), Net.HttpWebRequest)
Catch ex As System.UriFormatException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "地址格式錯誤:" & ex.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo a3
Catch ex As System.NotSupportedException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "不支持的地址格式!" & ex.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo a3
Catch ex As System.Net.WebException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "發生錯誤:" & ex.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo A3
Catch ex As Exception
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "發生未知錯誤:" & ex.InnerException.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo A3
End Try
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "準備開始下載(" & JOBS(URL, dd) & ")" & vbCrLf
If JOBS(Login, dd) = 1 Then
'加入認證
myReq.PreAuthenticate = True
If JOBS(Domain, dd) = "" Then
myReq.Credentials = New Net.NetworkCredential(JOBS(UserName, dd), JOBS(PassWord, dd))
Else
myReq.Credentials = New Net.NetworkCredential(JOBS(UserName, dd), JOBS(PassWord, dd), JOBS(Domain, dd))
End If
End If
If JOBS(FileSizeOk, dd) < Rollback Then
JOBS(FileSizeOk, dd) = 0
End If
Dim Duan As Boolean = False
If CInt(JOBS(FileSizeOk, dd)) > 0 And CInt(JOBS(FileSizeOk, dd)) < CInt(JOBS(RemoteFileSize, dd)) Then
' 加入斷點續傳,若未知文件大小不能續傳!!
myReq.AddRange(JOBS(FileSizeOk, dd) - Rollback)
Duan = True
End If
myReq.Timeout = TIME_OUT
''''''''''''''''''''''''''''''''開始返回數據
Try
myRep = myReq.GetResponse()
Catch Ex As System.Net.WebException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "服務器返回錯誤,狀態:" & Ex.Status & "。說明:" & Ex.Message & vbCrLf
JOBS(ERR_times, dd) += 1
JOBS(State, dd) = ST_ERROR
GoTo a3
End Try
'獲取實際文件名。沒有使用重命名,而且沒有收到任何數據。
If JOBS(RenameD, dd) = 0 And JOBS(FileSizeOk, dd) = 0 Then
Dim nname As String
nname = myReq.Address.LocalPath.ToString
i = nname.LastIndexOf("/")
nname = nname.Substring(i + 1)
If nname <> "" Then JOBS(FileName, dd) = JOBS(FileName, dd).Substring(0, JOBS(FileName, dd).LastIndexOf("\") + 1) & nname
End If
JOBS(RenameD, dd) = 1
'獲取HTTP的頭作為日志。
Dim hd As Net.WebHeaderCollection
hd = myRep.Headers
i = 0
While i < hd.Count
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & " " & hd.Keys(i).ToString & ":" & hd(i) & vbCrLf
i += 1
End While
'獲取長度
If Duan = False Then 'JOBS(RemoteFileSize, dd) = 0 And
Try
JOBS(RemoteFileSize, dd) = CInt(hd.GetValues("Content-Length")(0))
Catch ex As System.NullReferenceException
JOBS(RemoteFileSize, dd) = 0 '未知大小"
End Try
ElseIf Duan = True Then '斷點續傳檢查上次的文件,大小和這次的是否一樣!
If IO.File.Exists(JOBS(FileName, dd)) = False Then
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "錯誤:未找到本地文件!!" & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo a2
End If
Dim f As New IO.FileInfo(JOBS(FileName, dd))
If (CInt(JOBS(RemoteFileSize, dd)) - CInt(JOBS(FileSizeOk, dd) - Rollback) <> CInt(hd.GetValues("Content-Length")(0))) Or _
(f.Length <> CInt(JOBS(FileSizeOk, dd))) Then
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "錯誤:本地文件大小與上次下載時不一致!" & vbCrLf
GoTo a2
End If
End If
'''''''''''''''開始下載
Dim sr As IO.BinaryReader
Try
sr = New IO.BinaryReader(myRep.GetResponseStream)
Catch ex As IO.IOException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "讀取遠程數據發生錯誤!" & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo a2
End Try
Dim bb() As Byte
Dim fs As System.IO.FileStream
Try
If Duan = True Then
fs = New IO.FileStream(JOBS(FileName, dd), IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None, ReadBytes + 1) '打開文件
fs.Seek(JOBS(FileSizeOk, dd) - Rollback, IO.SeekOrigin.Begin)
JOBS(FileSizeOk, dd) -= Rollback
Else
If IO.File.Exists(JOBS(FileName, dd)) Then
Dim xx As Windows.Forms.DialogResult
xx = MessageBox.Show("文件已經存在,要覆蓋嗎?" & vbCrLf & "No為重命名!", "MobileAnt Demo", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
If xx = Windows.Forms.DialogResult.Yes Then
IO.File.Delete(JOBS(FileName, dd))
ElseIf xx = Windows.Forms.DialogResult.No Then
i = JOBS(FileName, dd).LastIndexOf("\")
Dim dir As String = JOBS(FileName, dd).Substring(0, i)
Dim nn As String = JOBS(FileName, dd).Substring(i + 1)
i = nn.LastIndexOf(".")
nn = nn.Substring(0, i) & "_*" & nn.Substring(i)
Dim dirs As String() = System.IO.Directory.GetFiles(dir, nn)
i = dirs.Length + 1
nn = dir & "\" & nn
dir = nn.Replace("_*", "_" & CStr(i))
If IO.File.Exists(dir) Then
i = -1
Do
i += 1
dir = nn.Replace("_*", "_" & CStr(i))
Loop Until IO.File.Exists(dir) = False
JOBS(FileName, dd) = dir
Else
JOBS(FileName, dd) = dir
End If
ElseIf xx = Windows.Forms.DialogResult.Cancel Then
Throw New IO.IOException("文件已經存在!沒有覆蓋!")
End If
End If
JOBS(FileSizeOk, dd) = 0
fs = New IO.FileStream(JOBS(FileName, dd), IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.None, ReadBytes + 1) '生成文件
End If
Catch ex As IO.IOException
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "生成下載文件時錯誤:" & ex.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
GoTo a2
End Try
Try
Do
bb = sr.ReadBytes(ReadBytes + 1)
JOBS(FileSizeOk, dd) += bb.Length
fs.Write(bb, 0, bb.Length)
If bb.Length <= 0 Then
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "下載完成" & vbCrLf
If JOBS(RemoteFileSize, dd) = 0 Then JOBS(RemoteFileSize, dd) = JOBS(FileSizeOk, dd)
JOBS(State, dd) = ST_OK_END
Exit Do
End If
If st = True Then
fs.Flush()
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "中斷下載!" & vbCrLf
JOBS(State, dd) = ST_STOP
Exit Do
End If
Loop
Catch ex As Exception
JOBS(logs, dd) &= TimeOfDay.ToLongTimeString & "接收數據時錯誤:" & ex.Message & vbCrLf
JOBS(State, dd) = ST_ERROR
End Try
A1: fs.Close()
A2: myRep.Close()
A3: i = dd
dd = -1
If JOBS(RemoteFileSize, i) > JOBS(FileSizeOk, i) And JOBS(State, i) <> ST_STOP Then
If AutoRestart = 1 And JOBS(FileSizeOk, i) - LAST_size > 0 Then
dd = i
Call Start_down()
End If
End If
'下載完成''''''''''''''''''''''''''''''''''''''''''''''''''
End Sub
End Class
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -