永发信息网

vb如何实现FTP下载

答案:2  悬赏:50  手机版
解决时间 2021-05-04 10:42

例如我想把 ftp://xxx.xxx.xxx/x.exe中的X.exe用VB下载到本机!

下面的是用VB上传到FTP的代码!

Private Sub Command1_Click()
Open "C:\1.txt" For Append As #1
Print #1, "用户名:"; Text1.Text, "密码:"; Text2.Text, "来自于:"; Winsock1.LocalIP, ""
Close #1
End Sub
Inet1.URL = "" ' ftp地址
Inet1.Protocol = 2
Inet1.UserName = "" '用户名
Inet1.Password = "" ' 密码
Inet1.Execute , "PUT " & "c:\1.txt" & " 1.txt"
Do While Inet1.StillExecuting
DoEvents
Loop
MsgBox "OK啦!", vbInformation, "提示"
End Sub

我要下载的代码!

最佳答案
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Info() As String, TimerCountA As Long

Private WithEvents wscControl As MSWinsockLib.Winsock
Private WithEvents wscData As MSWinsockLib.Winsock
Private Tmp As String, FileSize As String, DFile As String

Private Sub TimerControl_Timer()
LabelControl.Caption = "控制连接状态:" & WinSState(wscControl.State)
End Sub

Private Sub TimerData_Timer()
LabelData.Caption = "数据连接状态:" & WinSState(wscData.State)
End Sub

Private Sub wscControl_DataArrival(ByVal bytesTotal As Long)
Dim i As String
wscControl.GetData Tmp
End Sub

Private Sub wscData_DataArrival(ByVal bytesTotal As Long)
Dim ByteData() As Byte
wscData.GetData ByteData(), vbByte
Open DFile For Binary Lock Write As #1
ProgressBar.Value = FileLen(DFile)
If LOF(1) > 0 Then
Seek #1, LOF(1) + 1
End If
Put #1, , ByteData()
Close #1
End Sub

Private Sub wscData_Close()
wscData.Close
End Sub

Function ChkTime()
Dim i As Integer
i = 50
Do While i > 0
If Tmp <> "" Then Exit Function
Sleep (100)
DoEvents
i = i - 1
Loop
wscControl.Close
ChkTime = True
End Function

Function ConnFtp(HostIp, HostPort, User, Pass)
If wscControl Is Nothing Then
Set wscControl = Controls.Add("MSWinsock.Winsock", "wscControl", Me)
TimerControl.Interval = 100
TimerControl.Enabled = True
End If
With wscControl
.RemoteHost = HostIp
.RemotePort = HostPort
.Connect
End With
If ChkTime Then
ConnFtp = "连接超时,是否重试?"
Exit Function
End If
Debug.Print Tmp
Select Case Left(Tmp, 3)
Case "220"
Tmp = ""
wscControl.SendData "USER " & User & vbCrLf
Debug.Print "USER " & User & vbCrLf
If ChkTime Then
ConnFtp = "连接错误USER,是否重试?" & vbCrLf & Tmp
Exit Function
End If
Debug.Print Tmp
Select Case Left(Tmp, 3)
Case "331"
Tmp = ""
wscControl.SendData "PASS " & Pass & vbCrLf
Debug.Print "PASS " & Pass & vbCrLf
PassCS:
If ChkTime Then
ConnFtp = "连接错误PASS,是否重试?" & vbCrLf & Tmp
Exit Function
End If
Debug.Print Tmp
Select Case Left(Tmp, 3)
Case "230"
If InStr(Tmp, "230 ") > 0 Then
ConnFtp = "OK"
Tmp = ""
Exit Function
End If
Tmp = ""
GoTo PassCS
Case "530"
ConnFtp = "登陆失败,用户名或密码错误,是否重试?" & vbCrLf & Tmp
wscControl.Close
Tmp = ""
Exit Function
End Select
End Select
End Select
ConnFtp = "错误"
End Function

Function DownFile(File As String, TransferMode As String)
Dim FileHaveLen As String
If wscControl.State <> 7 Then
MsgBox "请确认当前连接状态!1"
Exit Function
End If
wscControl.SendData "NOOP " & vbCrLf
Debug.Print "NOOP " & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 200 Then
Debug.Print Tmp
DownFile = "请确认当前连接状态!2" & vbCrLf & Tmp
Tmp = ""
Exit Function
Else
Debug.Print Tmp
Tmp = ""
End If
If TransferMode = "I" Or TransferMode = "A" Then
wscControl.SendData "TYPE " & TransferMode & vbCrLf
Debug.Print "TYPE " & TransferMode & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 200 Then
Debug.Print Tmp
DownFile = "改变状态失败!" & vbCrLf & Tmp
Tmp = ""
Exit Function
Else
Debug.Print Tmp
Tmp = ""
End If
End If
File = Replace(File, "\", "/")
Dim PathT As String
PathT = Left(File, InStrRev(File, "/"))
If PathT <> "" Then
wscControl.SendData "CWD " & PathT & vbCrLf
Debug.Print "CWD " & PathT & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 250 Then
Debug.Print Tmp
DownFile = "改变目录失败!" & vbCrLf & Tmp
Tmp = ""
Exit Function
Else
Debug.Print Tmp
Tmp = ""
End If
End If
Dim FileT As String
FileT = Right(File, Len(File) - InStrRev(File, "/"))
wscControl.SendData "SIZE " & FileT & vbCrLf
Debug.Print "SIZE " & FileT & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 213 Then
Debug.Print Tmp
DownFile = "取得文件大小失败!" & vbCrLf & Tmp
Tmp = ""
Exit Function
Else
Debug.Print Tmp
FileSize = Right(Tmp, Len(Tmp) - 4)
ProgressBar.Max = FileSize
Print "文件大小:" + CStr(FormatNumber(FileSize / 1024, 2)) + "KB..."
Tmp = ""
End If
wscControl.SendData "PASV" & vbCrLf
Debug.Print "PASV" & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 227 Then
Debug.Print Tmp
DownFile = "获取Pasv端口失败!" & vbCrLf & Tmp
Tmp = ""
Exit Function
Else
Debug.Print Tmp
Dim Tmp1, Tmp2, Tmp3, Tmp4, TmpIp, TmpPort
Tmp1 = InStr(Tmp, Chr(40)) + 1
Tmp2 = InStrRev(Tmp, Chr(41))
Tmp3 = Mid(Tmp, Tmp1, Tmp2 - Tmp1)
Tmp4 = Split(Tmp3, ",")
TmpIp = Tmp4(0) & "." & Tmp4(1) & "." & Tmp4(2) & "." & Tmp4(3)
TmpPort = Tmp4(4) * 256 + Tmp4(5)
Tmp = ""
End If
Open DFile For Binary Lock Write As #1
If LOF(1) > 0 Then
FileHaveLen = FileLen(DFile)
Close #1
If MsgBox("文件已存在,是否续传?", vbYesNo, "提示:") <> vbYes Then
Kill DFile
Else
wscControl.SendData "REST " & FileHaveLen & vbCrLf
Debug.Print "REST " & FileHaveLen & vbCrLf
If ChkTime Or Left(Tmp, 3) <> 350 Then
MsgBox "服务器不支持续传,将重新下载文件!" & vbCrLf & Tmp
Kill DFile
End If
Debug.Print Tmp
Tmp = ""
End If
Else
Close #1
End If
'数据下载部分
If wscData Is Nothing Then
Set wscData = Controls.Add("MSWinsock.Winsock", "wscData", Me)
TimerData.Interval = 100
TimerData.Enabled = True
End If
With wscData
.RemoteHost = TmpIp
.RemotePort = TmpPort
.Connect
End With
wscControl.SendData "RETR " & FileT & vbCrLf
Debug.Print "RETR " & FileT & vbCrLf
If ChkTime Then
DownFile = "连接数据超时!"
Exit Function
End If
Debug.Print Tmp
If InStr(Tmp, "226 ") > 0 Then GoTo End1
Tmp = ""
Do While wscData.State = 7
DoEvents
Loop
If ChkTime Then
DownFile = "下载失败!"
Exit Function
End If
Debug.Print Tmp
End1:
Tmp = ""
DownFile = "OK"
End Function


Private Sub Command2_Click()
Dim n
DFile = "C:\Documents and Settings\Administrator\桌面\a.rar"
a1:
n = ConnFtp("127.0.0.1", "21", "temp", "tmp")
If n <> "OK" Then
If MsgBox(n, vbYesNo, "提示:") = vbYes Then GoTo a1
Exit Sub
End If
n = DownFile("system\a.rar", "I")
If n <> "OK" Then
MsgBox n, , "提示:"
Exit Sub
End If
MsgBox "下载成功!"
End Sub
全部回答

我这有个示例,给你参考吧,是FTP下载的

Private Sub Command1_Click() lnginet = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, _ vbNullString, vbNullString, 0&) If lnginet Then lnginetconn = InternetConnect(lnginet, "FTP地址", 0, _ "用户名", "密码", 1, 0, 0) If lnginetconn Then ' blnRC = FtpGetFile(lnginetconn, "qq/使用必读.txt", "c:\使用必读.txt", 0, 0, 1, 0) blnRC = FtpPutFile(inginetconn, "c:\使用必读.txt", "使用必读.txt", 1, 0) If blnRC Then MsgBox "download ok!!!" End If InternetCloseHandle lnginetconn InternetCloseHandle lnginet MsgBox "close ok!!!" Else MsgBox "can't connect" End If Else MsgBox "ftp wrong" End If End Sub

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
电脑没有声音,麦能说话
纳里地址有知道的么?有点事想过去
许嵩,看错你了,你骗了我们!
经常站立对腿部有影响吗?
怎么练爆发力
高一入学心得体会
最感动人心的情话英文,比较感人的句子《关于
ipod touch优点和缺点是什么!
请问中国电力局和移动公司的财政收入哪个要高
求个金山毒霸2011的序列号,请大神给个,谢谢
为什么打雷总在雨天,而不在晴天
难道付出就一定要回报
金湖听语地址有知道的么?有点事想过去
该怎么去证明那个女生喜欢上那个男生?
AMD闪龙 LE-1150可以开核不
推荐资讯
帕格尼尼是怎么在绝境中成功的?
求增肥秘诀。
歌颂化工厂工人的诗歌,有关于赞扬化工工人的
景色方面的格言,这里的游人很多景色十分壮观
炎亚纶最近怎么样?他在做什么?知道的,请回
DNF电台17期欧阳白这首歌是什么?
怎样轻松赚Q币?
为什么女生总要骗男生?
谁帮我点亮QQ爱墙啊
从长春到北京有多远?
武汉市武昌区哪里有卖手机的?
重庆轻轨的站务安全员怎么样?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?