VB.NET中使用FTP下載檔案的兩種方法
.net沒有專門處理FTP的類,我們可以通過呼叫系統自帶的FTP.EXE 或者是呼叫win32 API中的wininet.dll來完成基本操作。希望以下的程式碼能為大家拋磚引玉。
方法一: 使用Ftp.exe ,通過process類來呼叫它。
Imports System.Diagnostics
...
Public Sub GetFileByCallFtp()
'定義ProcessStartInfo,Process的啟動資訊。
Dim psi As New ProcessStartInfo
'ftp.exe的路徑最好放到配置檔案裡。
psi.FileName = "C:/WINNT/system32/ftp.exe"
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
'該值指示不使用作業系統Shell程式啟動程序。
psi.UseShellExecute = False
'命令集檔名.注意,路徑中不能有空格.
Dim fileName As String = "C/ftp.txt"
'-s:FileName表示,從檔案中讀取控制命令
psi.Arguments = "-s:" + fileName
Dim proc As Process
proc = Process.Start(psi)
'等待程序完成任務
proc.WaitForExit()
'在控制檯輸出結果
Console.WriteLine(proc.StandardOutput)
Console.ReadLine()
End Sub
==============================================================================
ftp.txt 裡的內容
方法二,使用win32 api —— wininet.dll
首先是,api宣告:
因為此測試程式,是VB.NET ConsoleApplication所以,api宣告寫在Module裡,
方法是靜態的。所以沒加Shared關鍵字, 這一點請大家注意。
<DllImport("wininet")> _
Public Function InternetOpen(ByVal sAgent As String, ByVal LAccessType As Integer, ByVal sProxyName As String, _
ByVal SProxyBypass As String, ByVal lFlags As Integer) As Integer
End Function
<DllImport("wininet")> _
Public Function InternetConnect(ByVal hInternetSession As Integer, ByVal sServerName As String, _
ByVal nServerPort As Integer, ByVal sUsername As String, _
ByVal sPassword As String, ByVal lService As Integer, _
ByVal lFlags As Integer, ByVal lContext As Integer) As Integer
End Function
<DllImport("wininet")> _
Public Function FtpGetFile(ByVal hFtpSession As Integer, ByVal lpszRemoteFile As String, _
ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, _
ByVal dwFlagsAndAttributes As Integer, ByVal dwFlags As Integer, _
ByVal dwContext As Integer) As Boolean
End Function
<DllImport("wininet")> _
Public Function InternetCloseHandle(ByVal hInet As Integer) As Integer
End Function
呼叫:
Public Sub GetFileByCallWininetDLL()
Try
Dim intinet As Integer = InternetOpen(Nothing, 0, Nothing, Nothing, 0)
If intinet > 0 Then
'引數:intinet的session值,ftp地址,埠,使用者名稱,密碼,lService, lFlags,lContext
Dim intinetconn As Integer = InternetConnect(intinet, "192.168.110.152", 0, "tokiwa", "tokiwa", 1, 0, 0)
If intinetconn > 0 Then
'下載某個檔案到指定檔案
Dim ret As Boolean = FtpGetFile(intinetconn, "pagerror.gif", "C:/itest.gif", 0, 0, 1, 0)
If ret Then
Console.WriteLine("ok!")
Console.ReadLine()
End If
InternetCloseHandle(intinetconn)
InternetCloseHandle(intinet)
Else
Console.WriteLine("can't connect!")
Console.ReadLine()
End If
Else
Console.WriteLine("ftp wrong!")
Console.ReadLine()
End If
Catch ex As Exception
Console.WriteLine(ex.Message)
Console.ReadLine()
End Try
End Sub