分享
 
 
 

用WinINet Api 开发FTP客户端 (三) ------ 完整代码

王朝system·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

Option Explicit

Public Const MAX_PATH = 260 ' 是由MFC定义的不要更改

Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0

Public Const INTERNET_OPEN_TYPE_DIRECT = 1

Public Const INTERNET_OPEN_TYPE_PROXY = 3

Public Const INTERNET_INVALID_PORT_NUMBER = 0

Public Const INTERNET_FLAG_PASSIVE = &H8000000 ' 被动模式

Public Const INTERNET_FLAG_PORT = &O0 ' 主动模式

Public Const INTERNET_SERVICE_FTP = 1

Public Const INTERNET_SERVICE_GOPHER = 2

Public Const INTERNET_SERVICE_HTTP = 3

Public Const ERROR_NO_MORE_FILES = 18

Public Const FTP_TRANSFER_TYPE_ASCII = &H1

Public Const FTP_TRANSFER_TYPE_BINARY = &H1

Public Const INTERNET_FLAG_RELOAD = &H80000000

Public Const INTERNET_FLAG_KEEP_CONNECTION = &H400000

Public Const INTERNET_FLAG_MULTIPART = &H200000

Type FILETIME

dwLowDateTime As Long

dwHighDateTime As Long

End Type

Type WIN32_FIND_DATA

dwFileAttributes As Long

ftCreationTime As FILETIME

ftLastAccessTime As FILETIME

ftLastWriteTime As FILETIME

nFileSizeHigh As Long

nFileSizeLow As Long

dwReserved0 As Long

dwReserved1 As Long

cFileName As String * MAX_PATH

cAlternate As String * 16 ' 是由MFC定义的不要更改

End Type

' 连接和初始化

' **********************************************************************************************************

Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _

(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _

ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _

(ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, _

ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, _

ByVal lFlags As Long, ByVal lContext As Long) As Long

Public Declare Function InternetCloseHandle Lib "wininet.dll" _

(ByVal hInet As Long) As Integer

' Ftp目录操作命令

' **********************************************************************************************************

Public Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" _

(ByVal hFtpSession As Long, lpszCurrentDirectory As String, ByRef lpdwCurrentDirectory As Long) As Boolean

Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" _

(ByVal hFtpSession As Long, ByVal lpszCurrentDirectory As String) As Boolean

Public Declare Function FtpCreateDirectory Lib "wininet.dll" Alias "FtpCreateDirectoryA" _

(ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean

Public Declare Function FtpRemoveDirectory Lib "wininet.dll" Alias "FtpRemoveDirectoryA" _

(ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean

' Ftp文件操作命令

' **********************************************************************************************************

' 查找文件或目录

Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _

(ByVal hFtpSession As Long, ByVal lpszSearchFile As String, _

lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long

' 查找下一个文件或目录

Public Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" _

(ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long

' 下载文件

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

' 上传文件

Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _

(ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _

ByVal lpszRemoteFile As String, _

ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean

' 删除文件

Public Declare Function FtpDeleteFile Lib "wininet.dll" _

Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, _

ByVal lpszFileName As String) As Boolean

' 文件改名

Public Declare Function FtpRenameFile Lib "wininet.dll" _

Alias "FtpRenameFileA" (ByVal hFtpSession As Long, _

ByVal lpszExisting As String, ByVal lpszNew As String) As Boolean

Public Sub main()

On Error GoTo Ftp_Err

Dim bActiveSession As Boolean ' 用于标记当前是否有活动会话

Dim hOpen As Long ' 用于保存当前会话的句柄

Dim hConnection As Long ' 用于保存活动连接的句柄

Dim EnumItemNameBag As New Collection ' 用于保存Ftp目录结构

Dim EnumItemAttributeBag As New Collection

' 开始 FTP 会话。

hOpen = InternetOpen("VB Wininet", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)

If hOpen = 0 Then

ErrorOut Err.LastDllError, "InternetOpen"

GoTo Exit_Sub

End If

' 连接到 FTP 服务器。

Dim strServer As String, strUser As String, strPassword As String

Dim nFlag As Long

strServer = "127.0.0.1"

strUser = "test"

strPassword = "test"

nFlag = INTERNET_FLAG_PASSIVE

hConnection = InternetConnect(hOpen, strServer, INTERNET_INVALID_PORT_NUMBER, _

strUser, strPassword, INTERNET_SERVICE_FTP, nFlag, 0)

If hConnection = 0 Then

ErrorOut Err.LastDllError, "InternetConnect"

GoTo Exit_Sub

End If

bActiveSession = True

' 更改为服务器上新的 FTP 目录。

Dim strRemoteFolder As String

Dim bRet As Boolean

strRemoteFolder = "/"

bRet = FtpSetCurrentDirectory(hConnection, strRemoteFolder)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpPutFile"

GoTo Exit_Sub

End If

' 检查目录是否存在

Dim pData As WIN32_FIND_DATA

Dim hFind As Long, nLastError As Long

strRemoteFolder = "test"

pData.cFileName = String(MAX_PATH, 0)

hFind = FtpFindFirstFile(hConnection, strRemoteFolder, pData, 0, 0) ' 查找第一个文件或目录

If hFind = 0 Then

' 没有找到

Err.Clear

' 创建目录

bRet = FtpCreateDirectory(hConnection, strRemoteFolder)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpPutFile"

GoTo Exit_Sub

End If

Else

' 已经存在

End If

' 改变目录

strRemoteFolder = "test" ' 使用相对目录和绝对目录都可以

bRet = FtpSetCurrentDirectory(hConnection, strRemoteFolder)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpPutFile"

GoTo Exit_Sub

End If

strRemoteFolder = ".." ' 使用相对目录和绝对目录都可以

bRet = FtpSetCurrentDirectory(hConnection, strRemoteFolder)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpPutFile"

GoTo Exit_Sub

End If

' 目录改名

' Dim strNewFolder As String

' strNewFolder = "TTT"

' bRet = FtpRenameFile(hConnection, strRemoteFolder, strNewFolder)

' If bRet = False Then

' ErrorOut Err.LastDllError, "FtpRenameFile"

' GoTo Exit_Sub

' End If

' 删除目录

strRemoteFolder = "test"

bRet = FtpRemoveDirectory(hConnection, strRemoteFolder)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpRemoveDirectory"

GoTo Exit_Sub

End If

' 获取 FTP 当前目录内容

Dim strItem As String

hFind = FtpFindFirstFile(hConnection, "", pData, 0, 0) ' 查找第一个文件或目录

nLastError = Err.LastDllError ' 没有错误返回0

If hFind = 0 Then

If (nLastError = ERROR_NO_MORE_FILES) Then

MsgBox "This directory is empty!"

Else

ErrorOut nLastError, "FtpFindFirstFile"

End If

GoTo Exit_Sub

End If

strItem = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0)))

EnumItemNameBag.Add strItem

' 查找 FTP 目录中的下一个文件。

If hFind <> 0 Then bRet = True

Do While bRet

bRet = InternetFindNextFile(hFind, pData)

If bRet Then

strItem = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0)))

EnumItemNameBag.Add strItem

End If

Loop

' 上传文件

Dim strFileLocal As String, strFileRemote As String, dwType As Long

dwType = FTP_TRANSFER_TYPE_ASCII

strFileLocal = "d:\ftpTest.rar"

strFileRemote = "ftpTest.rar"

bRet = FtpPutFile(hConnection, strFileLocal, strFileRemote, dwType, 0)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpPutFile"

GoTo Exit_Sub

End If

' 下载文件

strFileLocal = "c:\ftpTest.rar"

strFileRemote = "ftpTest.rar"

bRet = FtpGetFile(hConnection, strFileRemote, strFileLocal, False, _

INTERNET_FLAG_RELOAD, dwType, 0)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpGetFile"

GoTo Exit_Sub

End If

' 文件改名

Dim strNewFile As String

strNewFile = "TTT.rar"

bRet = FtpRenameFile(hConnection, strFileRemote, strNewFile)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpRenameFile"

GoTo Exit_Sub

End If

' 删除文件

bRet = FtpDeleteFile(hConnection, strNewFile)

If bRet = False Then

ErrorOut Err.LastDllError, "FtpRemoveDirectory"

GoTo Exit_Sub

End If

Exit_Sub:

' 结束 FTP 会话。

If hConnection <> 0 Then InternetCloseHandle hConnection

hConnection = 0

bActiveSession = False

Exit Sub

Ftp_Err:

MsgBox Err.LastDllError, vbCritical, "Test Ftp Client by WinInet.dll"

GoTo Exit_Sub

End Sub

Function ErrorOut(dError As Long, szCallFunction As String)

Dim strErrInf As String

Select Case dError

Case 12014

strErrInf = "用户名或密码错"

Case 12007

strErrInf = ""

Case 12003

strErrInf = "目录操作错误"

Case 12110

strErrInf = "文件不存在"

End Select

MsgBox "错误编号:" & Str(dError) & vbCrLf & vbCrLf & strErrInf & vbCrLf & vbCrLf & szCallFunction, vbCritical, "WinINet FTP Client"

Err.Clear

End Function

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有