用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

解决方案 »

  1.   

    to wild20010123(wildfox):
        我用你给出的代码运行时,有“与主机通讯出错”的提示,并不能下载文件。而直接用ie下载该文件是可以的。唉,好烦啊!~~~~~
    顺便提一下,该文件比较大,有20多M。
      

  2.   

    我有一办法,你可以一试
    先声明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)
      

  3.   

    to: donald21thzhang(邦德)
    不好意思,vb自带的 API浏览器 并没有这个函数啊?
    我找了好久都没有找到,是不是搞错了?!
      

  4.   

    还是不行啊,能不能给出具体一点的代码,比如你以前在具体的某个ftp站点实现过下载的代码!谢谢啦!:)
      

  5.   

    用winsock根据FTP协议直接获取!
    我正在给你写,一会儿贴上来...
      

  6.   

    呼...终于搞定了!
    如下:'需两个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*
    看起来是美国某政府部门的服务器,你不会是在窃取机密文件吧?:)