首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于FileCopy的一个细节问题,请指教,谢谢!
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:09:17 楼主
    我想用vb实现一个很简单的功能:

    1. 在对话框中,找到输入文件a(文件夹1中),再指定一个输出文件夹(文件夹2);
    2. 确定后,执行一个dos程序b.exe,生成2个文件c和d;
    3. 将a、c和d个文件拷贝到文件夹2中


    这个应该很容易实现,但在第3步中出了问题:

    都使用FileCopy命令,a可以拷贝过去,但c和d说找不到,但明明与a在同一个目录里啊!!

    后来发现,如果在拷贝a后加一条msgbox语句就可以了,加了:

    If Dir(str & "\a.txt") <> "" Then
    MsgBox "找到a文件"
    End If

    如上可以找到刚刚生成的文件,但如果:

    If Dir(str & "\a.txt") <> "" Then
    End If

    也还是找不到!

    请教一下这是什么原因?如何改正这个错误?谢谢


    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:52:371楼 得分:0
    应该是执行 c和d 的拷贝时,b.exe 的执行还未完成(未加MsgBox语句时)。

    把你的:
    If Dir(str & "\a.txt")  <> "" Then
      MsgBox "找到a文件"
    End If


    改成:
    VBScript code
    while(len(dir$(str & "\d.txt")) DoEvents Wend


    或用其它方法等待 b.exe 执行完成。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:53:362楼 得分:0
    上面是:while(len(dir$(str & "\d.txt") = 0)

    不好意思!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 21:55:213楼 得分:0
    回答你的问题比看懂你问题更难, 直接把代码全部贴出来吧,应该就是短短几行吧.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:54:164楼 得分:0
    我现在在家,代码在单位,只能明天了,

    2楼和3楼的可能误解我的意思,我是说FileCopy有滞后性,虽然我刚刚执行了b.exe,生成的c和d,但刚刚生成的c和d不能被filecopy找到,只有添加了那个msgbox后,再运行filecopy才能找到


    谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 22:59:385楼 得分:0
    VB按照顺序执行程序代码,当执行b.exe 后立即就执行 c和d 的拷贝,此时C和D还为生成或未读写完毕,故不能进行拷贝操作,可以采用延时API SLEEP 1000
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:00:026楼 得分:0
    我早就猜到了这个原因,这就是我让你贴出代码的原因,  我曾发过许多代码, 都是先运行DOS得到结果后,再读取返回内容, 这动作要先经过检测 exe是否已运行完毕才能去读取的, 我经常在用的就是 IsRunexe 这个涵数.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:01:337楼 得分:0
    我想是不是这样?

    我执行b.exe后需要一段时间才能生成c和d,但运行了b.exe后就执行了filecopy,但这时还没生成c和d,所以找不到,请问,是否有命令可以实现  确定b.exe执行结束了? 然后再运行filecopy?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:02:568楼 得分:0
    谢谢2楼的兄弟!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:07:169楼 得分:0
    引用 4 楼 jiangbai 的回复:
    我现在在家,代码在单位,只能明天了,

    2楼和3楼的可能误解我的意思,我是说FileCopy有滞后性,虽然我刚刚执行了b.exe,生成的c和d,但刚刚生成的c和d不能被filecopy找到,只有添加了那个msgbox后,再运行filecopy才能找到


    谢谢


    我可没有误会啊 ^_^
    请看清楚我的代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:07:5510楼 得分:0
    引用 6 楼 cbm666 的回复:
    我早就猜到了这个原因,这就是我让你贴出代码的原因,  我曾发过许多代码, 都是先运行DOS得到结果后,再读取返回内容, 这动作要先经过检测 exe是否已运行完毕才能去读取的, 我经常在用的就是 IsRunexe 这个涵数.


    请问isrunexe如何使用?谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:18:3411楼 得分:0
    http://topic.csdn.net/u/20080515/23/daf4ec97-b193-4c8d-a046-a0c4d90729cb.html

    http://topic.csdn.net/u/20080331/13/938be582-4ce6-4dd9-8a5e-2f94ca1c8473.html


    这个代码是使用DOS搜索并使用了 isrunexe
    【CBM666 的快速搜索文件】

    http://d.download.csdn.net/down/403615/cbm666

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:21:4012楼 得分:0
    谢了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:27:5313楼 得分:0
    引用 11 楼 cbm666 的回复:
    http://topic.csdn.net/u/20080515/23/daf4ec97-b193-4c8d-a046-a0c4d90729cb.html

    http://topic.csdn.net/u/20080331/13/938be582-4ce6-4dd9-8a5e-2f94ca1c8473.html


    这个代码是使用DOS搜索并使用了 isrunexe
    【CBM666 的快速搜索文件】 

    http://d.download.csdn.net/down/403615/cbm666



        Do
          DoEvents
        Loop Until Isrunexe("rar.exe") = False

    应该可以吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:29:5714楼 得分:0
        Do
          DoEvents
        Loop Until Isrunexe("b.exe") = False

    怎么自己发的帖子还修改不了?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:33:0315楼 得分:0
    呵呵, 你的运气不错, 我有现成的 刚好就是运行 rar.exe

    Option Explicit
    '********************************** 短路径名
    Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
    Dim jj&, wsource$, wtarget$, aa$, tmpstr$, starttm&, objWMIService, colProcesslist
    Private Sub Command1_Click() '压缩
      wsource = "e:\music\*.wma"
      wtarget = "c:\test.rar"
      aa = "rar a -ep " & wtarget & " " & wsource
      Call Shell(aa, vbHide)
      starttm = Timer
      Do
          DoEvents
          If Isrunexe("rar.exe") = False Then Exit Do
      Loop Until Timer > starttm + 60
      MsgBox "压缩完成!"
    End Sub

    Private Sub Command2_Click() '解压缩
        wsource = "c:\test.rar"
        wtarget = Environ("userprofile") & "\桌面"
        wtarget = Getshortname(wtarget)
        aa = "rar x " & wsource & " " & wtarget ' Shell 指令
        Call Shell(aa, vbHide)
        starttm = Timer
        Do
          DoEvents
          If Isrunexe("rar.exe") = False Then Exit Do
        Loop Until Timer > starttm + 60
        MsgBox "解压缩完成!"
    End Sub

    Public Function Isrunexe(ExeNm As String) As Boolean
      tmpstr = "."
      Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & tmpstr & "\root\cimv2")
      Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
      Isrunexe = IIf(colProcesslist.Count > 0, True, False)
      Set objWMIService = Nothing
      Set colProcesslist = Nothing
    End Function

    Public Function Getshortname(ByVal sLongFileName As String) As String
      Dim lRetVal&, sShortPathName$, iLen%
      sShortPathName = Space(255)
      iLen = Len(sShortPathName)
      lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
      Getshortname = Left(sShortPathName, lRetVal)
      jj = InStr(Getshortname, Chr(0))
      If jj > 0 Then Getshortname = Mid(Getshortname, 1, jj - 1)
    End Function
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:36:1716楼 得分:0
    你的 b.exe 如果是用 shell "cmd / b.exe.....的话

    则你应该要检测 cmd.exe 而不是 b.exe

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-16 23:38:3417楼 得分:0
    当然 如果你的 b.exe 在进程里看得到的话 最好还是检测 b.exe
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved