用INET控件
strXFname--网络路径 strFilePath--本地路径
strCommand = "GET " & strXFName & " " & strFilePath
Call FTpExec(strCommand)
Private Sub FTpExec(strExe As String)
Dim BoolFinish As Boolean
inetX.Execute strUrl, strExe
BoolFinish = inetX.StillExecuting
Do While BoolFinish
BoolFinish = inetX.StillExecuting
DoEvents
Loop
End Sub
strXFname--网络路径 strFilePath--本地路径
strCommand = "GET " & strXFName & " " & strFilePath
Call FTpExec(strCommand)
Private Sub FTpExec(strExe As String)
Dim BoolFinish As Boolean
inetX.Execute strUrl, strExe
BoolFinish = inetX.StillExecuting
Do While BoolFinish
BoolFinish = inetX.StillExecuting
DoEvents
Loop
End Sub
我用你给出的代码运行时,有“与主机通讯出错”的提示,并不能下载文件。而直接用ie下载该文件是可以的。唉,好烦啊!~~~~~
顺便提一下,该文件比较大,有20多M。
先声明api函数如下:
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _
(ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, _
ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
Dim hGet1 As Boolean '声明是否成功的监视变量
'输入如下语句
hGet1 = FtpGetFile(hConnection, "ftp服务器上的目的文件路径", "本地存放路径", False, INTERNET_FLAG_RELOAD, FTP_TRANSFER_TYPE_BINARY, 0)
不好意思,vb自带的 API浏览器 并没有这个函数啊?
我找了好久都没有找到,是不是搞错了?!
我正在给你写,一会儿贴上来...
如下:'需两个winsock
Option ExplicitDim stp As Long
Dim size As Long
Dim user As String
Dim passwd As String
Dim wantfile As String
Dim saveto As StringPrivate Sub Form_Load()
Winsock1.RemoteHost = "polar.wwb.noaa.gov" '指定连接主机
Winsock1.RemotePort = 21 '指定连接端口,FTP默认端口为23
user = "anonymous" '指定用户名"
passwd = "IEUser@" '指定密码
wantfile = "pub/waves/latest_run/nww3.all.grb" '指定想获取的文件
saveto = "c:\windows\desktop\nww3.all.grb" '指定保存地址Winsock1.Connect
End SubPrivate Sub Winsock1_Connect()
stp = 0
Debug.Print "已连接,正在登陆..."
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim a As String
Winsock1.GetData aSelect Case stp
Case 0
If Left(a, 4) = "220 " Then
Winsock1.SendData "USER " & user & vbCrLf
stp = 1
End If
Case 1
If Left(a, 4) = "331 " Then
Winsock1.SendData "PASS " & passwd & vbCrLf
stp = 2
End If
Case 2
If Left(a, 4) = "230 " Then
Debug.Print "登陆成功!"
Winsock1.SendData "TYPE I" & vbCrLf
stp = 3
End If
Case 3
If Left(a, 4) = "200 " Then
Winsock1.SendData "PASV" & vbCrLf
stp = 4
End If
Case 4
If Left(a, 4) = "227 " Then
Winsock2.RemoteHost = Winsock1.RemoteHostIP
Winsock2.RemotePort = GetPort(a)
Winsock2.Connect
stp = 5
End If
Case 5
If Left(a, 4) = "213 " And Right(a, 2) = vbCrLf Then
size = Val(Right(a, Len(a) - InStr(a, " ") + 1))
Debug.Print "文件大小:"; size
Debug.Print "保存到:"; saveto
Open saveto For Binary As #1
Winsock1.SendData "RETR " & wantfile & vbCrLf
stp = 6
End If
Case 6
If Left(a, 4) = "150 " Then Debug.Print "正在接收文件..."
End SelectEnd Sub
Private Sub Winsock2_Connect()
Winsock1.SendData "SIZE /" & wantfile & vbCrLf
End SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim f() As Byte
Winsock2.GetData f
If size - LOF(1) < UBound(f) - LBound(f) + 1 Then
ReDim Preserve f(LBound(f) + (size - LOF(1)))
Put 1, , f
Close
stp = 5
Winsock1.SendData "BYE " & vbCrLf
Winsock1.Close
Winsock2.Close
Debug.Print "保存完毕!"
Else
Put 1, , f
End If
End SubPrivate Function GetPort(s As String) As Long
Dim a As Long, b As Long, temp As Long, temp2 As Long
temp = InStr(s, ",")
temp = InStr(temp + 1, s, ",")
temp = InStr(temp + 1, s, ",")
temp = InStr(temp + 1, s, ",") + 1
temp2 = InStr(temp + 1, s, ",") + 1
a = Val(Mid(s, temp, temp2 - 2))
b = Val(Mid(s, temp2, InStr(temp2, s, ")") - 1))
GetPort = a * 256 + b
End Function
以上代码经我测试可以下载那个文件,你根据自己的代码调整一下就行了。
简单考虑,没有加错误处理,你可以自己完善!
成功后如果你愿意请多给我些分,我花了将近3个小时!!
另外问一句,那是什么文件啊?
我登陆上去后出现:
220-**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING*
220-
220-YOU HAVE ACCESSED A UNITED STATES GOVERNMENT COMPUTER.
220-USE OF THIS COMPUTER WITHOUT AUTHORIZATION OR FOR
220-PURPOSES FOR WHICH AUTHORIZATION HAS NOT BEEN EXTENDED
220-IS A VIOLATION OF FEDERAL LAW AND CAN BE PUNISHED WITH
220-FINES OR IMPRISONMENT (PUBLIC LAW 99-474). REPORT
220-SUSPECTED VIOLATIONS TO THE SYSTEM SECURITY OFFICER.
220-
220-**WARNING**WARNING**WARNING**WARNING**WARNING**WARNING*
看起来是美国某政府部门的服务器,你不会是在窃取机密文件吧?:)