📄 98.htm
字号:
<p></p>
<p> 下面是在路径中得到下一个文件的调用: </p>
<p></p>
<p>blnRC = InternetFindNextFile(lngHINet, pData) </p>
<p></p>
<p> 如果调用成功,blnRC 返回 True,否则 blnRC 为False。Err对象的LastDllError返回18表明再没有文件存在了。 </p>
<p></p>
<p> 现在再回来看看基本的四步:第1步和第2步(设置环境和连接服务器)应该已经完成。以下列出的第三步。最后一步,第四步,就清除环境和连接句柄,跟前面一样: </p>
<p></p>
<p>Dim pData As WIN32_FIND_DATA </p>
<p></p>
<p>Dim lngHINet As Long </p>
<p></p>
<p>Dim intError As Integer </p>
<p></p>
<p>Dim strTemp As String </p>
<p></p>
<p>Dim blnRC As Boolean </p>
<p></p>
<p></p>
<p></p>
<p>'init the filename buffer </p>
<p></p>
<p>pData.cFileName = String(260, 0) </p>
<p></p>
<p></p>
<p></p>
<p>'get the first file in the directory... </p>
<p></p>
<p>lngHINet = FtpFindFirstFile(mlngINetConn, "*.*", pData, 0, 0) </p>
<p></p>
<p></p>
<p></p>
<p>'how'd we do? </p>
<p></p>
<p>If lngHINet = 0 Then </p>
<p></p>
<p> 'get the error from the findfirst call </p>
<p></p>
<p> intError = Err.LastDllError </p>
<p></p>
<p> </p>
<p></p>
<p> 'is the directory empty? </p>
<p></p>
<p> If intError < > ERROR_NO_MORE_FILES Then </p>
<p></p>
<p> 'whoa...a real error </p>
<p></p>
<p> 卐rror handler? </p>
<p></p>
<p> End If </p>
<p></p>
<p> </p>
<p></p>
<p>Else </p>
<p></p>
<p> </p>
<p></p>
<p> 'we got some dir info... </p>
<p></p>
<p> 'get the name </p>
<p></p>
<p> strTemp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1) </p>
<p></p>
<p></p>
<p></p>
<p> 卻tore the file info someplace? </p>
<p></p>
<p> </p>
<p></p>
<p> 'now loop through the rest of the files... </p>
<p></p>
<p> Do </p>
<p></p>
<p> 'init the filename buffer </p>
<p></p>
<p> pData.cFileName = String(260, 0) </p>
<p></p>
<p> </p>
<p></p>
<p> 'get the next item </p>
<p></p>
<p> blnRC = InternetFindNextFile(lngHINet, pData) </p>
<p></p>
<p> </p>
<p></p>
<p> 'how'd we do? </p>
<p></p>
<p> If Not blnRC Then </p>
<p></p>
<p> </p>
<p></p>
<p> 'get the error from the findnext call </p>
<p></p>
<p> intError = Err.LastDllError </p>
<p></p>
<p> </p>
<p></p>
<p> 'no more items </p>
<p></p>
<p> If intError < > 18 Then </p>
<p></p>
<p> 'whoa...a real error </p>
<p></p>
<p> 卐rror handler? </p>
<p></p>
<p> </p>
<p></p>
<p> Exit Do </p>
<p></p>
<p> </p>
<p></p>
<p> Else </p>
<p></p>
<p> </p>
<p></p>
<p> 'no more items... </p>
<p></p>
<p> Exit Do </p>
<p></p>
<p> </p>
<p></p>
<p> End If </p>
<p></p>
<p> </p>
<p></p>
<p> Else </p>
<p></p>
<p> </p>
<p></p>
<p> 'get the last item returned </p>
<p></p>
<p> strTemp = Left(pData.cFileName, InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1) </p>
<p></p>
<p> </p>
<p></p>
<p> 卻tore the file info someplace? </p>
<p></p>
<p></p>
<p></p>
<p> End If </p>
<p></p>
<p> </p>
<p></p>
<p> Loop </p>
<p></p>
<p> </p>
<p></p>
<p> 'close the handle for the dir listing </p>
<p></p>
<p> InternetCloseHandle lngHINet </p>
<p></p>
<p> </p>
<p></p>
<p>End If </p>
<p></p>
<p></p>
<p></p>
<p> 现在可以看到,即使是有一些复杂的任务,例如列举路径,都可以简单地纳入这简单的四步过程:设置环境,连接主机,执行FTP任务,关闭环境和连接句柄。 </p>
<p></p>
<p>你自己的FTP ActiveX 服务器组件 </p>
<p></p>
<p> 要使这篇文章完整,本文包括一个FTP ActiveX 服务器组件的VB源代码。代码中包含3个类模块:clsITEM.CLS 、colITEM.CLS和 FTP.CLS。clsITEM.CLS 包含的类定义以clsITEM作为类名,在列举一个路径时包含着单独的文件信息。colITEM.CLS 包含的类定义以colItem作为类名,用于使用clsITEM 类的文件集合。最后FTP.CLS 包含的类定义以ASPFTP 作为类名,用于所有的FTP函数。我还要包含一个工程文件TP_CLASSES.VBP)。 </p>
<p></p>
<p> 除了源代码,还包含了每个函数的样本ASP文件,一个包含文件(ASPFTP2.INC) ,你可以将它包含在每个ASP文件中使一些函数的调用更简单。例如,这里是使用FTP Get 函数的ASP代码。服务器,电子邮件用户名,口令,远程和本地文件名,使用的传输类型(ASCII 或 Binary),当本地文件存在时是否覆盖,这些都被输入一个表单中(未显示)并用ASP Request 对象引用: </p>
<p></p>
<p>< %@ LANGUAGE=VBScript % > </p>
<p></p>
<p>< !--#Include File="aspftp2.inc"-- > </p>
<p></p>
<p>< % </p>
<p></p>
<p>'check to see if user submitted form </p>
<p></p>
<p>If Request.Form("GetIt") < > "" Then </p>
<p></p>
<p>Dim objFTP </p>
<p></p>
<p>Dim strMsg </p>
<p></p>
<p></p>
<p></p>
<p>'create reference to object </p>
<p></p>
<p>Set objFTP = Server.CreateObject("NIBLACK.ASPFTP") </p>
<p></p>
<p></p>
<p></p>
<p>'set the properties for the connection </p>
<p></p>
<p>objFTP.sServerName = Request.Form("Server") </p>
<p></p>
<p>objFTP.sUserID = Request.Form("User_ID") </p>
<p></p>
<p>objFTP.sPassword = Request.Form("Password") </p>
<p></p>
<p></p>
<p></p>
<p>'connect to the host </p>
<p></p>
<p>If objFTP.bConnect Then </p>
<p></p>
<p>'set the properties for the get function </p>
<p></p>
<p>objFTP.bOverWrite = Request.Form("OverWrite") </p>
<p></p>
<p>objFTP.lTransferType = Request.Form("Transfer_Type") </p>
<p></p>
<p></p>
<p></p>
<p>'now get the file </p>
<p></p>
<p>If objFTP.bGetFile(Request.Form("Remote_File"), Request.Form("Local_File")) Then </p>
<p></p>
<p> 'get was successful </p>
<p></p>
<p> strMsg = "Get Successful!" </p>
<p></p>
<p>Else </p>
<p></p>
<p> 'get failed...let user know </p>
<p></p>
<p> strMsg = "Get Failed: " & objFTP.sError </p>
<p></p>
<p>End If </p>
<p></p>
<p>Else </p>
<p></p>
<p>'connection failed...let user know </p>
<p></p>
<p>strMsg = "Connection Failed: " & objFTP.sError </p>
<p></p>
<p>End If </p>
<p></p>
<p> </p>
<p></p>
<p>'clean up... </p>
<p></p>
<p>Set objFTP = Nothing </p>
<p></p>
<p></p>
<p></p>
<p>Else </p>
<p></p>
<p>'default return msg </p>
<p></p>
<p>strMsg = "" </p>
<p></p>
<p>End If </p>
<p></p>
<p>% > </p>
<p></p>
<p></p>
<p></p>
<p> 我还为许多许多FTP函数创建了uick?方法。基本上,你调用一种uick?方法,用来完成任务的所有参数都包含在方法调用中,而不用在ASP代码中设置每一个属性。举例说,这里的ASP代码使用FTP Get 函数。服务器,电子邮件用户名,口令,远程和本地文件名,使用的传输类型(ASCII 或 Binary),当本地文件存在时是否覆盖,这些都被输入一个表单中(未显示)并用ASP Request 对象引用。 </p>
<p></p>
<p></p>
<p></p>
<p>< %@ LANGUAGE=VBScript % > </p>
<p></p>
<p>< !--#Include File="aspftp2.inc"-- > </p>
<p></p>
<p>< % </p>
<p></p>
<p>'check to see if user submitted form </p>
<p></p>
<p>If Request.Form("GetIt") < > "" Then </p>
<p></p>
<p>Dim objFTP </p>
<p></p>
<p>Dim strMsg </p>
<p></p>
<p></p>
<p></p>
<p>'create reference to object </p>
<p></p>
<p>Set objFTP = Server.CreateObject("NIBLACK.ASPFTP") </p>
<p></p>
<p></p>
<p></p>
<p>'now get the file </p>
<p></p>
<p>If objFTP.bQGetFile(Request.Form("Server"), Request.Form("User_ID"), _ </p>
<p></p>
<p> Request.Form("Password"), Request.Form("Remote_File"), Request.Form("Local_File"), _ </p>
<p></p>
<p> Request.Form("Transfer_Type"), Request.Form("OverWrite")) Then </p>
<p></p>
<p> 'get was successful </p>
<p></p>
<p> strMsg = "Get Successful!" </p>
<p></p>
<p>Else </p>
<p></p>
<p> 'get failed...let user know </p>
<p></p>
<p> strMsg = "Get Failed: " & objFTP.sError </p>
<p></p>
<p>End If </p>
<p></p>
<p> </p>
<p></p>
<p>'clean up... </p>
<p></p>
<p>Set objFTP = Nothing </p>
<p></p>
<p></p>
<p></p>
<p>Else </p>
<p></p>
<p>'default return msg </p>
<p></p>
<p>strMsg = "" </p>
<p></p>
<p>End If </p>
<p></p>
<p>% > </p>
<p></p>
<p>下面如何? </p>
<p></p>
<p> 有了提供的源代码,你就已经有了一个FTP函数的ActiveX服务器组件。现在我们可以跟随同样的基本步骤,创建一个客户机侧的OCX ,你可以将其包含在你的HTML页中以允许用户从他们的PC进行FTP。还可以看看WinINet API提供的一些其它函数。例如你可以使用HTTP函数创建一个机器人,将Web 站点的内容拉回来,对所有的页进行索引。或者创建一个探测器,在一个预定的基础上, </p>
<p></p>
<p>用HTTP函数检测Web 站点或Web 页的状态。用WinINet API所提供的功能,这些和更多的想法都可以相当简单地来探索。 </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -