当前位置:编程学习 > VB >>

VB运行DOS命令生成文本文件并打开处理的问题????

用VB执行DOS命令,生成文本文件随即打开 
但是由于文本文件生成需要一段时间, 
还未等文件生成完毕VB就打开了这个文件 
请问如何让程序等待DOS命令执行完毕再打开这个文本文件啊 
最好还能加上一个等待的进度条显示文本文件的生成过程 

代码如下: 
Shell "cmd  /c dir /s /b e:\ dir.txt" 
Open "dir.txt" For Input As #1 

怎么让dir.txt生成完毕再打开啊? --------------------编程问答-------------------- 咋会有同样的问题,也是同样的分数:如何让程序等待DOS命令执行完毕再打开这个文本文件啊 --------------------编程问答-------------------- 用时钟吧!隔一段时间检查文件是否存在. --------------------编程问答-------------------- 参考2楼页面,用chenjl1031大哥方法。
Private Sub Command1_Click()
        Dim lFileSize As Long
        Shell "cmd /c dir e:/s/a/l>e:\dir.txt", vbHide
cjl:    If Dir("e:\dir.txt") <> "" Then
           lFileSize = FileLen("e:\dir.txt")
           If lFileSize <> 0 Then
           Shell "notepad.exe " & "e:\dir.txt", vbNormalFocus
           Else
              GoTo cjl
           End If
        Else
           GoTo cjl
        End If
End Sub
--------------------编程问答-------------------- 参考一下吧:

Option Explicit

Private Sub Command1_Click()
'    Shell "cmd  /c dir /s /b e:\ c:\dir.txt"
    Shell "cmd  /c dir e:\>c:\dir.txt"

    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    Timer1.Enabled = False
    Timer1.Interval = 1000
End Sub

Private Sub Timer1_Timer()
    lblInfo.Caption = CStr(FileLen("c:\dir.txt"))
End Sub
--------------------编程问答-------------------- 在代码中间加个时钟不行么? --------------------编程问答-------------------- 我在这里不是已经回答了吗? (无须任何API和Timer事件):
http://topic.csdn.net/u/20100303/16/f798eae8-c7ae-45fe-8d25-0839194c4519.html --------------------编程问答-------------------- 说说为什么不能用Sleep和Timer控件:
1、用API函数Sleep把握不住Shell运行究竟需要多长时间;
2、用Timer增加额外控件,降低了系统效率,不能考虑。

其实 ,用下面的代码可以粗略估计一下Shell的运行时间和goto的次数,应该说所用时间是最短的,是比较合理的。除此以外,还可以用API函数WaitForSingleObject,没有跟这个API比较过,孰优孰劣。具体所用时间跟当时所用的内存环境和Dir那个盘的目录大小有关!也许这个时间每次都不一样!具体用的时候要在程序中加一个doevents!

Option Explicit
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Dim Number As Long, StartTime As Long, EndTime As Long


Private Sub Command1_Click()
        Dim lFileSize As Long
        StartTime = GetTickCount
        Shell "cmd /c dir e:/s/a/l>e:\dir.txt", vbHide
cjl:    Number = Number + 1
        If Dir("e:\dir.txt") <> "" Then
           EndTime = GetTickCount
           lFileSize = FileLen("e:\dir.txt")
           If lFileSize <> 0 Then
           Shell "notepad.exe " & "e:\dir.txt", vbNormalFocus
           Else
              GoTo cjl
           End If
        Else
           GoTo cjl
        End If
        Debug.Print "Number="; Number, "Shell运行时间为:"; (EndTime - StartTime) / 1000; "秒"
End Sub
  
--------------------编程问答-------------------- pid=shell(...)
'等待目标进程退出的信号
WaitForSingleObject pid,.....
......



这才是王道。。楼主给点分吧 --------------------编程问答-------------------- 关键是如何加上一个等待的进度条显示文本文件的生成过程 ?因为执行DOS命令需要很长时间
--------------------编程问答-------------------- 还是参考这个吧。
Private Sub Command1_Click()'找出文件夹内文件最新的更新时间(包括里面的子文件夹的文件哈) 要把这个文件夹内的所有文件的最后修改时间都要检查一次,并取出近的一个时间,(主要是检查这个文件夹里面的内容有没有更新),并取出这个文件最后一次的更新时间.环境是VB6
Dim after As Double
Dim f As Integer
Dim dn As String
Dim fn As String
Dim ft As String
Dim ft_date As Date
Command1.Enabled = False

On Error GoTo ERR0
Kill "c:\files.txt"

dn = "c:\windows"
On Error GoTo ERR1
Shell ("cmd /c dir " & dn & "\*.* /a-d /b /s /o-d >c:\files.txt")
after = Now + 60# / 3600# / 24#
f = FreeFile()
Do
REOPEN1:
    DoEvents
    If Now > after Then
        MsgBox "Wait c:\files.txt 60s overtime!"
        Exit Sub
    End If
    Open "c:\files.txt" For Input Lock Read Write As #f
    Line Input #f, fn
    Close #f
    Exit Do
Loop

On Error GoTo ERR0
Kill "c:\files.txt"

On Error GoTo ERR2
Shell ("cmd /c dir " & Chr(34) & fn & Chr(34) & ">c:\files.txt")
after = Now + 60# / 3600# / 24#
f = FreeFile()
Do
REOPEN2:
    DoEvents
    If Now > after Then
        MsgBox "Wait c:\files.txt 60s overtime!"
        Exit Sub
    End If
    Open "c:\files.txt" For Input Lock Read Write As #f
    Line Input #f, ft
    Line Input #f, ft
    Line Input #f, ft
    Line Input #f, ft
    Line Input #f, ft
    Line Input #f, ft
    Close #f
    Kill "c:\files.txt"
    Exit Do
Loop
ft = Left(ft, 17)
ft_date=CDate(ft)
MsgBox "The newest file in [" & dn & "] is [" & fn & "], datetime is [" & ft_date & "]"
Command1.Enabled = True
Exit Sub
ERR0:
    Resume Next
ERR1:
    Resume REOPEN1
ERR2:
    Resume REOPEN2
End Sub
--------------------编程问答-------------------- 关于进度条,用progressbar控件,
progressbar.max= 100
progressbar.value= 当前完成文件数/总文件数*100
但用dos命令不好控制返回,建议用递归扫描的方法完成 --------------------编程问答-------------------- 用不着那么复杂,学360,做个循环的进度条,或者用一个标签计一下时间持续了多少秒也行。用DOS命令Dir命令列目录,用户不知道进度如何,因为那是操作系统的事,列了多少,还剩多少,这些都不知道。只要简单实用就行。
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,