首页 > 开发 > 综合 > 正文

用VB创建FTP组件(get)

2024-07-21 02:15:40
字体:
来源:转载
供稿:网友
基本步骤:

1、用一个internetopen调用设置环境。

2、调用internetconnect 函数与主机连接。

3、调用ftpgetfile 达到文件。

4、关闭第1、2步创建的句柄,用internetclosehandle 函数。

现在来仔细看看每一步:

1、通过调用internetopen 函数设置环境。下面是vb特定调用这一函数的声明:


private 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



  参数sagent 用来指定调用wininet 函数的应用程序或实体。为了达到目的,可以设置ftp控制。



  参数laccesstype 指定我们是直接与某一主机相连还是使用代理服务器相连。如果传递值1,就直接与主机连接。如果传递3,就通过代理服务器。如果传递0,连接时就要基于

hkey_current_user/software/microsoft/windows/currentversion/internet settings下的注册表数值

proxyenable、proxyserver和 proxyoverride 。



  我们可以使用参数sproxyname和 sproxybypass,而不是注册设置来提供代理服务器和不使用代理服务器的ip地址和名字。列出代理的基本格式是rotocol=protocol://proxy_name:access_port?。例如,要指定proxy1 上的端口21为代理服务器,用ftp=ftp://proxy1:21?作为sproxyname。要饶过以ov? 开始的任何主机,sproxybypass 字符串应为ov*? 。



  最后,lflags 用来显示影响函数结果的不同选择。在我们的例子中,我们传递0。

  所以,不使用代理而打开一个internet session 时,我们的调用是这样的:

lnginet = internetopen(“ftp control”, 1, vbnullstring, vbnullstring, 0)

  如果函数调用失败,lnginet 为0。不然,lnginet 就保存在下一步中将要传递给internetconnect

函数的句柄的值。

2、通过调用internetconnect 函数与主机连接。vb特定调用这一函数的声明是:

private 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



  第一个参数hinternetsession 是internetopen 调用返回的句柄值。

  sservername 是我们即将连接的ftp服务器的ip地址或主机名。

  nserverport 指示与哪一个端口连接。在我们的例子中使用的值为0,它指示的是默认的端口21。

  susername 和 spassword 分别传递用户名和口令。

  lservice 用来指示使用的服务类型,如http, ftp等。通常传递值为1,表示ftp服务。

  如果将x8000000传递到 lflags 参数,连接将使用被动ftp语义。或者,在我们的例子中,传递0来使用非被动语义。



  最后,当使用回叫信号时,lcontext 用来识别应用程序的前后关系。因为在我们的例子中不使用回叫信号,所以这个值为0。



  现在使用匿名的电子邮件用户名与主机ftp.microsoft.com 相连接:

lnginetconn = internetconnect(lnginet, “ftp.microsoft.com”, 0, _

  “anonymous”,”[email protected]”, 1, 0, 0)



  如果函数调用失败,则lnginetconn 为0。反之,lnginetconn 就保存在下一步中将传递给ftpgetfile 的句柄的值。



3、现在我们已经实现了连接,然后就需要调用ftpgetfile 。这个函数完成从一个ftp服务器上读取文件并在本地存储时有关的所有管理功能。vb特定调用这一函数的声明是:



private 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



  第一个参数hftpsession 是internetconnect 调用返回的句柄值。

  lpszremotefile和lpsznewfile 分别是ftp服务器上的文件名和将在本地机上创建的文件名。

  ffailifexists 标志是0(替换本地文件)或1 (如果本地文件已经存在则取消)。

  dwflagsandattributes 用来指定本地文件的文件属性。在我们的例子中忽略,只传递0。

  dwflags 参数指定为1是用ascii 传输文件(a类传输方法),指定为2是用二进制传输文件(1类传输方法)。由于dirmap.txt 是ascii 文本文件,我们传递值1。

  最后,当使用回叫信号时,lcontext 用来识别应用程序前后关系。因为在我们的例子中不使用回叫信号,所以这个值为0。

  所以,以下是得到dirmap.txt文件并将其存在 c:/dirmap.txt的调用。如果本地文件已经存在,就覆盖它。

blnrc = ftpgetfile(lnginetconn, “dirmap.txt”,”c:/dirmap.txt”, 0, 0, 1, 0)

  如果函数调用成功,blnrc为 true, 反之为false。

4、现在文件已经被接收,使用internetclosehandle 调用来关闭连接和session 句柄。vb特定调用这一函数的声明是:



private declare function internetclosehandle lib "wininet.dll" (byval hinet as long) as integer.



  如同指明的一样,此函数只有一个参数hinet,是要关闭或抛弃的句柄的值。因为internetconnection 和internetopen 中有句柄,就需要调用这个关闭函数两次。另外因为internetconnection 句柄是由internetopen 句柄决定的,关闭他们时的顺序与创建时相反。

  以下是调用函数:

internetclosehandle lnginetconn

internetclosehandle lnginet



  用这短短的四步就完成了ftp get。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表