安国有(松原职业技术学院)
摘要:无论是编程爱好者,还是单位的信息管理人员,都希望以人们熟知的windows资源浏览器形式调取远程,为此,本文主要介绍如何利用VB.NET和SHGetFileInfo函数实现其功能。
关键词:VB.NETSHGetFileInfo远程资源浏览器
1开发及调试的基本环境
安装windowsserver2003服务器一台,工作站若干,其中一台工作安装VS2005,主要用于编写和调试程序。
2程序涉及对象及基本设置
首先,在VS2005环境下建立一个解决方案文件(mybrow.sln),然后创建一个窗体文件myfrm.vb,然后在窗体上按下面界面放置控件。
其主要控件设置及其功能说明如下表:
3实现各项功能的程序模块
3.1引用命名空间
ImportsSystem.IO:ImportsSystem.Text:ImportsMicrosoft
ImportsSystem.Net:ImportsSystem.runtime.interopservices
3.2定义登录FTP服务器,所需窗体级对象及变量
PrivateuribAsUriBuilder:PrivatedlyzAsNetworkCredential
PrivatemyreAsFtpWebRequest:PrivatepnAsString
PrivatehnAsString:PrivatephAsString:PrivateunAsString
PrivatepdAsString:PrivateupstrAsStream
3.3定义连接远程FTP服务器函数
PrivateSubloginserver()
Try
urib=NewUriBuilder("ftp",hn,Integer.Parse(pnumber),ph)
myre=CType(FtpWebRequest.Create(urib.Uri),FtpWebRequest)
dlyz=NewNetworkCredential(un,pd):myre.Credentials=dlyz
myre.KeepAlive=False:myre.Method="list"
CatchexAsWebException
MsgBox(ex.Message)
EndTry
EndSub
3.4定义获得Ftp根目录下文件资源函数
PrivateSubgetroot()
Try
DimmyreAsFtpWebResponse=CType(myre.GetResponse,FtpWebResponse)
DimmystreamAsStream=myre.GetResponseStream()
DimmystreaAsStreamReader=NewStreamReader(mystream,Encoding.Default)
DimstrAsString=mystrea.ReadToEnd()
Dimdirfilestr()AsString=Split(str,vbCrLf)
DimdirfiletmpAsString=""
ForEachstr1AsStringIndirfilestr
IfVisualBasic.Left(str1,1)="d"Then
dirfiletmp+=str1&vbCrLf
EndIf
Next
ForEachstr1AsStringIndirfilestr
IfVisualBasic.Left(str1,1)<>"d"Then
dirfiletmp+=str1&vbCrLf
EndIf
Next
dirfilestr=dirfiletmp.Split(vbCrLf)
WithList1
.Items.Clear()
DimiAsInteger=0
ForEachstr1AsStringIndirfilestr
Ifstr1.Trim.Length=0ThenExitFor
DimFDnameasstring=str1.Substring(55,str1.Length-55)
DimFDlngasstring=str1.Substring(31,12)
DimFDdateasstring=str1.Substring(43,12)
DimFDxxasstring=str1.Substring(0,10).Trim
IfFDname.Trim<>"."AndFDname.Trim<>".."Then
IfVisualBasic.Left(FDxx,1)="d"Then
DimitAsListViewItem:it=.Items.Add(FDname)
.Items(i).ImageKey="dir":it.SubItems.Add("文件夹")
it.SubItems.Add(FDlng):t.SubItems.Add(FDdate)
Else
geticon(FDname,FDlng,FDdate)
EndIf
i=i+1
EndIf
Next
EndWith
CatchexAsWebException
MsgBox(ex.Message)
EndTry
EndSub
3.5定义获取资源类型图标函数
PrivateSubgeticon(ByValfnAsString,ByValflngAsString,ByValfdateAsString)
DimextAsString=Path.GetExtension(fn)
DimicoAsIcon:Dimshfi_smallAsNewshfileinfo
Im1.ImageSize=NewSystem.Drawing.Size(16,16)
Try
DimLtemAsListViewItem
SHGetFileInfo(ext,0,shfi_small,Marshal.SizeOf(shfi_small),SHGFI_SMALLICONOrshgfi_iconOrshgfi_usefileattributes)
ico=Icon.FromHandle(shfi_small.hicon)
DimkeyindexAsInteger=Im1.Images.IndexOfKey(ext)
Ifkeyindex<0Then
Im1.Images.Add(ico):keyindex=Im1.Images.Count-1
Im1.Images.SetKeyName(keyindex,ext)
EndIf
Ltem=NewListViewItem(fn):LstItem.ImageIndex=keyindex
List1.Items.Add(Ltem):LstItem.SubItems.Add("文件")
DimfilelsAsLong=flng\1024
Ltem.SubItems.Add(filels.ToString+"KB")
Ltem.SubItems.Add(fdate)
CatchexAsException
MsgBox(ex.ToString())
EndTry
EndSub
4登录远程服务器,并获取文件资源
在登录按钮的单击事件中,编写如下语句。
PrivateSubB1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesB1.Click
hn=T1.Text:pn=“21”
un=T2.Text:pd=T3.Text
ph="":loginserver():getroot()
EndSub
上述,即为实现其功能代码,爱好者稍加修改即可完成基于网络的资源上传和下载功能,同时敬请各位同行批评指正。