分享
 
 
 

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

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

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- 王朝網路 版權所有