2010-10-07 103 views
2

我正在使用Delphi 2010和ShellAPI。随着我正在构建的计划的增长,我需要一点帮助。下面是本申请的玩笑:如何在delphi中延迟shell命令?

检查是否在一定条件存在 如果所述条件存在,它开始执行其是依赖于前一个执行

uses 
    ShellApi; 

procedure RenameDir(DirFrom, DirTo: string); 
var 
    shellinfo: TSHFileOpStruct; 
begin 
    with shellinfo do 
    begin 
    Wnd := 0; 
    wFunc := FO_RENAME; 
    pFrom := PChar(DirFrom); 
    pTo := PChar(DirTo); 
    fFlags := FOF_FILESONLY or FOF_ALLOWUNDO or 
       FOF_SILENT or FOF_NOCONFIRMATION; 
    end; 
    SHFileOperation(shellinfo); 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    RenameDir('C:\Dir1', 'C:\Dir2'); 

    RenameDir('C:\Dir3', 'C:\Dir'); 


end; 

我是2个外壳命令新手在德尔福,但我可以看到这个问题,第二个命令在上一个命令完成之前执行。我如何解决这个问题,以便第一个命令在第二个命令被调用之前执行并完成?

更新:我添加了完整的伪代码,以便它显示我试图执行的操作。

+2

Delphi默认库中没有可用的RenameDir过程...我建议您查看您正在使用的库的文档以了解其工作原理(可能是异步)以及如何了解第一个操作何时完成执行第二个成功。 – jachguate 2010-10-07 23:48:20

+0

想知道什么版本的Delphi有一个ShellAPI.pas中的RenameDir例程?不是D2009/D2010 ... – 2010-10-08 05:31:44

+0

我很抱歉,RenameDir是使用SHFileOperation的过程。我没有提供足够的细节来获得我所需要的帮助 – JamesW 2010-10-08 13:09:43

回答

2

如果您使用的命令是外部命令/程序,请考虑使用CreateProcess()并将INFINITE传递给WaitForSingleObject()。查看ExecAndWait()示例here

+1

@JamesW,我猜你正在使用'SHFileOperation()'重命名目录,对不对?你为什么不用'MoveFile()'来代替? 'MoveFile()'已经异步工作,速度更快,而且不必担心目前的问题。 – Vantomex 2010-10-08 08:13:53

+0

是Vantomex我正在使用SHFileOperation。我将尝试MoveFile选项 – JamesW 2010-10-08 13:06:30

+0

Vantomex MoveFile选项正是我所需要的。我已经测试过,并且在这一点上有100%的工作应用程序。感谢您能够解读我非常模糊的描述并帮助我解决这些问题。 – JamesW 2010-10-08 13:32:31

0

两个简单的方法可以做到这一点:

  1. 插入睡眠(X);命令,然后用低或者5或10来填充x(应该是你需要的所有ms)。
  2. 在两者之间插入Application.ProcessMessages命令以允许其他事件(包括重命名)完成。
+2

如果重命名异步发生,这两种情况都不一定有效,这似乎就是这种情况。 – 2010-10-08 00:16:53

+0

梅森这就是发生了什么。任何想法如何解决它? – JamesW 2010-10-08 00:57:31

+0

我已经尝试了application.processmessages命令,它仍然有相同的问题 – JamesW 2010-10-08 13:24:36

0

也许你可以使用SHChangeNotifyRegister()在实际改变目录名时得到通知。