哪位老大帮忙编一下啊!谢谢了!目录结构:
c:\log\file\2007
c:\log\file\2008
c:\log\file\2009
c:\log\file\logXXXXXX程序目的:
1,获取c:\log\file\logXXXXXX这个目录的XXXXXX值(每台机器都是这样以log开头+数字的文件夹名)
2,拷贝c:\log\file\logXXXXXX目录下以log开头的文件(如log1020.txt)到匿名登陆的FTP服务器XXXXXX目录下Private Sub Form_Load()
Dim Riqi As String, Year As String, Path As String, S As String Riqi = Format(Date, "mmdd")
Year = Format(Date, "yyyy")
Path = "C:\LOG\file
S = Dir(Path, vbDirectory)
Label1.Caption = Riqi
Label2.Caption = Year
Label3.Caption = Path
Label4.Caption = S
End Sub
c:\log\file\2007
c:\log\file\2008
c:\log\file\2009
c:\log\file\logXXXXXX程序目的:
1,获取c:\log\file\logXXXXXX这个目录的XXXXXX值(每台机器都是这样以log开头+数字的文件夹名)
2,拷贝c:\log\file\logXXXXXX目录下以log开头的文件(如log1020.txt)到匿名登陆的FTP服务器XXXXXX目录下Private Sub Form_Load()
Dim Riqi As String, Year As String, Path As String, S As String Riqi = Format(Date, "mmdd")
Year = Format(Date, "yyyy")
Path = "C:\LOG\file
S = Dir(Path, vbDirectory)
Label1.Caption = Riqi
Label2.Caption = Year
Label3.Caption = Path
Label4.Caption = S
End Sub
Visual Basic 作为一个集应用程序开发、测试、查错功能于一 体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据 库维护系统的过程中,选择了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\ftp hostname
username
password
send c:\zrh\upload.txt upload.txt
bye
该命令实现了文件"upload.txt"的传输要求。在使用完毕之后, 再调用命令把该文件删除。
例子:Shell("c:\windows\del_up.bat")
批处理文件del_up.bat 的内容:
c:\windows\ftp hostname
username
password
dele upload.txt
bye
这样,文件"upload.txt"被删除。
但是,另一个问题出现了。由于Shell 函数的运行机制是与其它 程序同步执行,也就是说,当调用Shell 函数的子程序还没有执行完毕 之前,Shell函数后面的语句已经执行。在大批量添加数据的过程中, 就会出现某个记录的文件还没有传到,而下一个插入语句(I nsert)已 经开始调用。这样,ODBC调用就会出现错误。
2. INET 控件
Internet Transfer控件提供了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
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop
这样便实现了文件的上载。
*SINET 控件的优点
INET控件与Shell()函数的不同之处在于INET控件通过调用语句
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop来控制语句执行的顺序。在文件传输工作未完成之前,程序 不会执行其它语句,自然也就不会出现调用Shell 函数所出现的问题 。变量right1用来测试inet1 的执行状态,如果进程中仍在进行文件 传输的工作,则调用过程DoEvents给系统空闲时间来做文件传输工作, 这样便成功地执行了文件上载的功能。该文件使用完毕之后将被删除 。
Inet1.Execute "ftp://informix:informix@rd", _
"DELETE UPLOAD1.TXT"
right1 = Inet1.StillExecuting
Do While right1
right1 = Inet1.StillExecuting
DoEvents
Loop
将上载的文件删除是为了避免占用服务器端磁盘空间。
*S利用StateChanged事件提示信息
服务器在执行inet1.execute 的同时也激活了Inet1_StateChang ed事件,进程可以根据捕获到的状态进行动作。
object_StateChanged(ByVal State As Integer)
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 在与主机通信的过程中发生了错误icResponseComp leted
12 请求结束且数据已经接收到
下面是一个例子。
Private Sub Inet1_StateChanged(ByVal State As Integer)
' Retrieve server response using the GetChunk
' method when State = 12. This example assumes the
' data is text.
Select Case State
' ... Other cases not shown.
Case icResponseReceived ' 12
Dim vtData As Variant ' Data variable.
Dim strData As String: strData = ""
Dim bDone As Boolean: bDone = False
' Get first chunk.
vtData = Inet1.GetChunk(1024, icString)
Do While Not bDone
strData = Data & vtData
' Get next chunk.
vtData = Inet1.GetChunk(1024, icString)
If Len(vtData) = 0 Then
bDone = True
End If
Loop
txtData.Text = strData
End Select
End Sub
1,没有获取文件夹名和登陆对应FTP文件夹的方法
2,没有根据日期选择上传文件的方法后面粘贴的页面,我也搜索到了。主要上面两个问题没法解决。
Dim sLogName As String
Dim s As String
s = Dir("c:\log\file\log*", vbDirectory)
If LenB(s) = 0 Then
MsgBox "没有 c:\log\file\logXXXXXX 格式的目录。", vbExclamation
Exit Sub
End If
sLogName = Mid$(s, 4)
打开Inet1...
Inet1.Execute , "CD " & sLogName
s = Dir("C:\log\file\log" & sLogName & "\log*.txt")
While LenB(s) <> 0
Inet1.Execute , "PUT C:\log\file\log" & sLogName & "\" & s & " " & s
While Inet1.StillExecuting
DoEvents
Wend
s = Dir()
Wend
End Sub
不过我在运行execute时总出现"仍在执行上一请求"Private Sub Form_Load()
Dim Date01 As String, Year01 As String, Path01 As String, S As String Date01 = Format(Date, "mmdd")
Date01 = "log" & Date01 - 1 & ".txt"
Year01 = Format(Date, "yyyy")
Path01 = "C:\log\file\"
Do
S = Dir$(Path01 & "\log*", vbDirectory)
If (Len(S) = 11) Then
If (IsNumeric(Mid$(S, 4))) Then Exit Do
End If
S = Dir$()
Loop While (S > "")
S = Right(S, 4)
Path01 = Path01 & "log1212" & S & "\" & Year(Date) & "\" & Date01 Inet1.RemoteHost = "192.168.1.1"
Inet1.RemotePort = 2020
Inet1.RequestTimeout = 30
Inet1.Execute , "cd " & S
While LenB(Path01) <> 0
Inet1.Execute , "put " & Path01 & " " & Date01
While Inet1.StillExecuting
DoEvents
Wend
WendEnd Sub
Inet1.Execute , "CD " & sLogName
While Inet1.StillExecuting
DoEvents
Wend
s = Dir("C:\log\file\log" & sLogName & "\log*.txt")
While LenB(s) <> 0
Inet1.Execute , "PUT C:\log\file\log" & sLogName & "\" & s & " " & s
While Inet1.StillExecuting
DoEvents
Wend
s = Dir()
Wend
2,还是运行就不动了……我把后面上传部分去掉,发现进入S目录这步就长时间停顿了。
相当郁闷!!!
Inet1.Execute , "ls"
While Inet1.StillExecuting
DoEvents
Wend
If Inet1.ResponseCode <> 0 Then
MsgBox Inet1.ResponseInfo
End If
Inet1.Execute , "cd " & s
...
[email protected] 大虾,偶也想学习学习。3Q
你要先用命令行的 ftp 操作保证可访问的才行。
可是responseinfo还是反馈“没有更多文件”
unix 的别名设置可以让命令的表现千差万别,需要服务器管理员帮助分析。
226 ransfer complete
1125 bytes received in 0.01seconds 75.00kbytes/sec服务器管理员就是偶自己