2010-10-07 51 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()在實際改變目錄名時得到通知。