对于FTP,你可以使用Execute方法执行FTP命令SIZE获得文件大小。然后在StateChanged事件中可以获得返回的文件大小。 
Private Sub Command1_Click() 
Inet1.Execute "ftp://127.0.0.1", "SIZE 1.gif" 
End Sub 
Private Sub Inet1_StateChanged(ByVal State As Integer) 
'State = 12 时,用 GetChunk 方法检索服务器的响应。 
Dim vtData As Variant ' Data variable. 
Select Case State 
'...没有列举其它情况。 
Case icError '11 
'出现错误时,返回 ResponseCode 和 ResponseInfo。 
vtData = Inet1.ResponseCode & ":" & _ 
Inet1.ResponseInfo 
Case icResponseCompleted ' 12 
Dim strData As String 
Dim bDone As Boolean: bDone = False 
'取得第一个块。 
vtData = Inet1.GetChunk(1024, icString) 
DoEvents 
Do While Not bDone 
strData = strData & vtData 
'取得下一个块。 
vtData = Inet1.GetChunk(1024, icString) 
DoEvents 
If Len(vtData) = 0 Then 
bDone = True 
End If 
Loop 
MsgBox strData 
End Select 
End Sub 
对于HTTP下载,你可以用GetHeader(Content-length)来获得文件大小。但不是所有HTTP下载时都能获得文件长度,特别是通过代理服务器下载文件时。如: 
Private Sub Form_Load() 
Inet1.Execute "http://askpro.yeah.net/" 
End Sub 
Private Sub Inet1_StateChanged(ByVal State As Integer) 
If State = icResponseReceived Then 
MsgBox "File size is " & Inet1.GetHeader("Content-Length") 
End If 
End Sub
==============================================
在VB中实现文件上传 
VisualBasic作为一个集应用程序开发、测试、查错功能于一体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端操作系统,Informix作为服务器数据库。 
问题的出现 
在开发该维护系统的过程中,注意到Informix数据库的字段类型CLOB填入数据时需要函数FILETOCLOB("FILENAME","SERVER"),其中的"FILENAME"需要指出文件路径和文件名称。然而,在维护过程中此文件是在客户端执行的,这样就要求即时将文件传输到服务器端。 
解决办法 
1.FTP传输工具 
我们首先使用FTP传输工具,用VB5.0中SHELL命令调用DOS批处理文件来实现传输的需要。 
Shell调用格式: 
Shell(pathname[,windowstyle]) 
例子:Shell("c:\windows\upload.bat") 
批处理文件upload.bat的内容: 
c:\windows\ftphostname 
username 
password 
sendc:\zrh\upload.txtupload.txt 
bye 
该命令实现了文件"upload.txt"的传输要求。在使用完毕之后,再调用命令把该文件删除。 
例子:Shell("c:\windows\del_up.bat") 
批处理文件del_up.bat的内容: 
c:\windows\ftphostname 
username 
password 
deleupload.txt 
bye 
这样,文件"upload.txt"被删除。 
但是,另一个问题出现了。由于Shell函数的运行机制是与其它程序同步执行,也就是说,当调用Shell函数的子程序还没有执行完毕之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中,就会出现某个记录的文件还没有传到,而下一个插入语句(Insert)已经开始调用。这样,ODBC调用就会出现错误。 
2.INET控件 
InternetTransfer控件提供了Internet上最常使用的两种协议:HTTP和FTP。使用HTTP协议可以连接到WWW服务器上来下载文件;使用FTP协议则可以登录到FTP服务器。一般的FTP命令,例如CD、GET都可以通过Execute方法实现。 
下面是一个设置INET控件属性的例子。 
inet1.URL=ftp://username:password@hostname/document 
inet1.Protocol=2-icFTP 
inet1.RemoteHost=hostname 
inet1.RemotePort=21 
inet1.Username=username 
inet1.Password=password 
执行文件传输: 
Inet1.Execute"ftp://username:password@hostname",_ 
"PUT"&local_filename&"UPLOAD1.TXT" 
right1=Inet1.StillExecuting 
DoWhileright1 
right1=Inet1.StillExecuting 
DoEvents 
Loop 
这样便实现了文件的上载。 
*SINET控件的优点 
INET控件与Shell()函数的不同之处在于INET控件通过调用语句 
right1=Inet1.StillExecuting 
DoWhileright1 
right1=Inet1.StillExecuting 
DoEvents 
Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序不会执行其它语句,自然也就不会出现调用Shell函数所出现的问题。变量right1用来测试inet1的执行状态,如果进程中仍在进行文件传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作,这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除。 
Inet1.Execute"ftp://informix:informix@rd",_ 
"DELETEUPLOAD1.TXT" 
right1=Inet1.StillExecuting 
DoWhileright1 
right1=Inet1.StillExecuting 
DoEvents 
Loop 
将上载的文件删除是为了避免占用服务器端磁盘空间。 
*S利用StateChanged事件提示信息 
服务器在执行inet1.execute的同时也激活了Inet1_StateChanged事件,进程可以根据捕获到的状态进行动作。 
object_StateChanged(ByValStateAsInteger) 
State:整数类型Integer 
下面是状态的说明。 
常数值 描述icNone 
0 未报告状态icHostResolvingHost 
1 控件正在寻找指定主机的IP地址icHostResolved 
2 控件已成功找到指定主机的IP地址icConnecting 
3 控件正在与指定主机进行连接icConnected 
4 控件已成功与指定主机连接icRequesting 
5 控件正在向主机发出请求icRequestSent 
6 控件已成功向主机发出请求icReceivingResponse 
7 控件正在从主机接收反馈信息icResponseReceived 
8 控件已成功从主机接受反馈信息icDisconnecting 
9 控件正在与主机断开icDisconnected 
10 控件已与主机断开icError 
11 在与主机通信的过程中发生了错误icResponseCompleted 
12 请求结束且数据已经接收到 
下面是一个例子。 
PrivateSubInet1_StateChanged(ByValStateAsInteger) 
'RetrieveserverresponseusingtheGetChunk 
'methodwhenState=12.Thisexampleassumesthe 
'dataistext. 
SelectCaseState 
'...Othercasesnotshown. 
CaseicResponseReceived'12 
DimvtDataAsVariant'Datavariable. 
DimstrDataAsString:strData="" 
DimbDoneAsBoolean:bDone=False 
'Getfirstchunk. 
vtData=Inet1.GetChunk(1024,icString) 
DoWhileNotbDone 
strData=Data&vtData 
'Getnextchunk. 
vtData=Inet1.GetChunk(1024,icString) 
IfLen(vtData)=0Then 
bDone=True 
EndIf 
Loop 
txtData.Text=strData 
EndSelect 
EndSub
==========================================
方法2,设置信息: 
Inet1.Protocol = icFTP 
Inet1.RemoteHost = ServerName'服务器地址 
Inet1.RemotePort = 21'FTP端口 
Inet1.UserName = uName'用户名 
Inet1.Password = uPWS'密码 
下载文件: 
Inet1.Execute "", "GET 1.txt d:\1.txt" 
ri = Inet1.StillExecuting 
Do While ri 
ri = Inet1.StillExecuting 
DoEvents 
Loop 
上传文件: 
Inet1.Execute "", "PUT d:\1.txt 1.txt" 
ri = Inet1.StillExecuting 
Do While ri 
ri = Inet1.StillExecuting 
DoEvents 
Loop
| NDF网站建设淘宝店 | 联系我们 | 
| ©2007-2025 NDF Corporation |