VB驱动pcAnyWhere进行文件传输

来源:网络时间:2011-04-25

  PCAnyWhere的使用非常简单,它的使用方法在网上有非常详细的介绍,我就不再多说,我介绍一下利用VB驱动PCAnyWhere的方法。

  在我的一个项目中有特别的应用,有五个处于不同地方的计算机,有实时数据采集文件,我需要定时拔号上去,将上面的数据文件下载下来,这些数据文件随时间的不同就有不同,所以没有办法做固定的自动文件传输,为此我分别研究了软件提供script与OLE白皮书,最终决定选用OLE。

  一、利用OLE进行远程连接

  在OLE白皮书上,将OLE驱动写得十分明白,我只要将我的连接代码帖上来,应该十分明白。

  1、检查MODEM是否在使用,由于PCAnyWhere启动后不能再由程序控制,我们必须检查MODEM是否是空闲才能确保拔号可以顺利外拔。检查MODEM空闲可能通过打开MODEM所在的串口是否成功来判断。

  2、生成RemoteDataManager对象

  3、进入C:DocumentsandSettingsAllUsersApplicationDataSymantecpcAnywhere,由于 PCAnyWhere安装时将配置文件都放在这个目录下,我们将运行路径切换到这个目录下,可以更方便地使用。

  4、生成RemoteData对象,这要求在配置文件路径下有对应CHF文件上,这是在PCAnyWhere中配置的,只要名称与连接方式相同就可以了。

  5、设置拔号的电话号码,设置登录的用户名与密码,设置进行自动传输的ATF文件,并将RunOnConnect设为TRUE,并将这此配置的修改进行保存。

  6、开始拔号并自动传输文件。

  7、延时,判断MODEM是否空闲,空闲则这一次拔号、文件传输完毕(也有可能失败)。判断已下载的文件,如果修改时间已更新,则这次是成功的。否则是失败的。

  8、将RemoteData、RemoteDataManager对象释放。

  9、拔下一个点。

IfcheckMODEMIdleThen

showBegin注释:显示开始信息

注释:CreateCRemoteDataManagerobject

SetRemoteDataManager=CreateObject("WINAWSVR.RemoteDataManager")

RemoteDataManager.ChangeDirectory"C:DocumentsandSettingsAllUsersApplicationDataSymantecpcAnywhere"

S=RemoteDataManager.CurrentDirectory()

CHFile=xProfile.GetValue(WatchPoint(nowRunID),"CHFFILE")注释:用于拔号的配置

SetRemoteData=RemoteDataManager.RetrieveObject(CHFile,2,0)

RemoteData.PhoneNumber=xProfile.GetValue(WatchPoint(nowRunID),"PHONENUM")

RemoteData.AutoXferFile=filename

RemoteData.AutoLoginName=xProfile.GetValue(WatchPoint(nowRunID),"USERNAME")

RemoteData.AutoLoginPassword=xProfile.GetValue(WatchPoint(nowRunID),"PSW")

RemoteData.RunOnConnect=True

RemoteData.WriteObject(0)

S=RemoteData.PhoneNumber

RemoteData.Launch

Sleep30000

Do

IfcheckMODEMIdleThenExitDo

DoEvents

Sleep5000

Loop

注释:取文件结束,要进行转存处理

moveDBFDatalocalpath

SetRemoteData=Nothing

SetRemoteDataManager=Nothing

nowRunID=nowRunID 1

EndIf

  注意:一次完毕后必须将RemoteData、RemoteDataManager对象释放,不然会出现错乱的现象。

  好了,拔号自动文件传输已经实现了,但这个文件传输是在PCANYWHERE中配置好的不变的自动文件传输,不能实现我要的根据时间不同下载不同文件的要求。

  二、动态生成自动文件传输文件

  为了动态生成自动文件传输,自然要修改自动文件传输文件的配置,可OLE中没有给出这方面的功能,我不得不另辟蹊径了。

  用文本编辑器打开ATF文件(自动文件传输文件),发现全是乱码,只有路径可以识别。灵机一动用UltraEdit-32打开并用十六进制打开,哈,秘密全在其中。

  ATF的系统文件格式如下:

  04404154460100010100010101010001注释:第八位:00表示增量下载,01全部重新下载

  000000000000000100FFFF0000110043注释:第八位:00表示文件传输完毕后不挂断,01表示文件传输完毕后不挂断言C

  4175746F586665725F436F6D6D616E64AutoXfer_Command

  0113453A5C55534242414B5C32303033第一位是传输方式:00发到主机01从主机接收02同步第二位是本地文件路径长度,后面的是本地文件路径

  312E64626614443A5C71746461746131注释:第六个主机文件路径长度,后面的是主机文件路径

  5C32303033312E646266

  有了文件的组成格式,生成这么一个文件就不在话下了。只要用二进制方式生成这个文件,就一切OK了。

PublicSubmakeATFFile(ByVallocalpathAsString,ByValremotepathAsString,ByValfilenameAsString)

Dimtx()AsByte

DimiiAsInteger

Dimlen1,len2AsInteger

len1=Len(localpath)

len2=Len(remotepath)

ReDimtx(0To48 len1 len2 2)

注释:04404154460100010100010101010001注释:第八位:00表示增量下载,01自然下载

注释:000000000000000100FFFF0000110043C

注释:4175746F586665725F436F6D6D616E64AutoXfer_Command

注释:0113453A5C55534242414B5C32303033第一位是传输方式:00发到主机01从主机接收02同步第二位是本地文件路径长度

注释:312E64626614443A5C71746461746131注释:第六个主机文件路径长度

注释:5C32303033312E646266

tx(0)=&H4

tx(1)=&H40

tx(2)=&H41

tx(3)=&H54

tx(4)=&H46

tx(5)=&H1

tx(6)=&H0

tx(7)=&H1

tx(8)=&H1

tx(9)=&H0

tx(10)=&H1

tx(11)=&H1

tx(12)=&H1

tx(13)=&H1

tx(14)=&H0

tx(15)=&H1

tx(16)=&H0

tx(17)=&H0

tx(18)=&H0

tx(19)=&H0

tx(20)=&H0

tx(21)=&H0

tx(22)=&H0

tx(23)=&H1

tx(24)=&H0

tx(25)=&HFF

tx(26)=&HFF

tx(27)=&H0

tx(28)=&H0

tx(29)=&H11

tx(30)=&H0

tx(31)=&H43

注释:4175746F586665725F436F6D6D616E64AutoXfer_Command

tx(32)=&H41

tx(33)=&H75

tx(34)=&H74

tx(35)=&H6F

tx(36)=&H58

tx(37)=&H66

tx(38)=&H65

tx(39)=&H72

tx(40)=&H5F

tx(41)=&H43

tx(42)=&H6F

tx(43)=&H6D

tx(44)=&H6D

tx(45)=&H61

tx(46)=&H6E

tx(47)=&H64

注释:0113453A5C55534242414B5C32303033第一位是传输方式:00发到主机01从主

tx(48)=&H1

tx(49)=len1

Forii=1Tolen1

tx(49 ii)=Asc(Mid(localpath,ii,1))

Nextii

tx(49 len1 1)=len2

Forii=1Tolen2

tx(49 ii len1 1)=Asc(Mid(remotepath,ii,1))

Nextii

注释:二进制文件打开

OnErrorResumeNext

OpenfilenameForBinaryAs#1

Forii=0To48 len1 len2 2

Put#1,,tx(ii)

Nextii

Close1

EndSub

  输入本地文件路径,主机文件路径,ATF文件名,就可生成这么一个文件,再将RemoteData.AutoXferFile设成新生成的ATF文件,你就可以想传什么就传什么文件了,不过,有一点要注意:这两个文件路径都是必须存在的,不然会出错。

  结论:

  利用VB驱动pcAnyWhere是一件非常简单的事件,但不是很好,首先它无法完成由程序控制,还有是在拔号与文件传输时会出现操作界面,无法将其置为一个后台程序,而人工的干预也过于容易,不过,在解决我当前的问题方面,它是一个非常好的选择。

发表评论

最新评论(共0条)