2010-07-14 96 views
0

我想用IFileOperation CopyItem複製文件從一個目錄到另一個目錄 是有一個簡單的例子,在Delphi 7中使用IFileOperation?在Delphi 7

+1

你知道這是隻打算從Vista和更高的工作嗎?所以沒有XP或Server 2003和更低? – 2010-07-14 11:57:07

+0

如果您有新問題,請不要編輯這個問題。你所做的改變沒有任何意義,它使給定的答案無效。 – Will 2010-07-19 12:23:29

回答

3

在我原來的答覆的時間,在 TFileOperation CopyItem Delphi search先打是 nice blog post由布魯諾·馬丁斯Stuani使用 IFileOperation及其 CopyItem方法。
該帖子包含Delphi示例代碼。

編輯: 與從2010年的Delphi,所述IFileOperation接口在ShlObj單元定義。
這取決於在該單元不少其他東西,所以它不是一個快速的「複製粘貼」在這裏(除了一個事實,即單位受版權保護)。

--jeroen

+0

博客文章是關於截取fileoperations,但沒有解釋如何使用IFileOperation.CopyItem? – 2010-07-14 12:35:49

+0

實際上,您的Google搜索中的第一次點擊指向此頁面,其中有跳轉到另一個頁面的第一個鏈接的指令,該頁面指向跳轉到ano第一個鏈接的頁面。[STACKOVERFLOW] – 2010-07-14 12:36:51

+0

@Wouter:由於Delphi 7不包含IFileOperation的翻譯,因此我將'use'理解爲'具有IFileOperation接口的Delphi翻譯。布魯諾提供了這一點。 @The_Fox:在我寫作的時候它是; StackOverflow有很棒的搜索引擎優化,所以通常它很快會在谷歌搜索結束。這就是爲什麼我發佈了Bruno發佈的鏈接。我很高興你提供了一個更廣泛的答案,並給你一個upvote。 - jeroen – 2010-07-14 12:46:35

7

我發現MSDN documentation和它包括一個例子。下面是翻譯成德爾福的例子:

uses ActiveX, ComObj, ShlObj; 

function TForm1.CopyItem(const aSrcItem, aDest, aNewName: string): HRESULT; 
const 
    CLSID_FileOp: TGUID = '{3ad05575-8857-4850-9277-11b85bdb8e09}'; 
var 
    lFileOperation: IFileOperation; 
    psiFrom: IShellItem; 
    psiTo: IShellItem; 
begin 
    // 
    // Initialize COM as STA. 
    // 
    Result := CoInitializeEx(nil, COINIT_APARTMENTTHREADED or COINIT_DISABLE_OLE1DDE); 
    if Succeeded(Result) then 
    begin 

    // 
    // Create the IFileOperation interface 
    // 
    Result := CoCreateInstance(CLSID_FileOp, nil, CLSCTX_ALL, IFileOperation, 
          lFileOperation); 
    if Succeeded(Result) then 
    begin 
     // 
     // Set the operation flags. Turn off all UI from being shown to the 
     // user during the operation. This includes error, confirmation, 
     // and progress dialogs. 
     // 
     Result := lFileOperation.SetOperationFlags(FOF_NO_UI); 
     if Succeeded(Result) then 
     begin 
     // 
     // Create an IShellItem from the supplied source path. 
     // 
     Result := SHCreateItemFromParsingName(aSrcItem, 
             nil, 
             IShellItem, psiFrom); 
     if Succeeded(Result) then 
     begin 
      if aDest <> '' then 
      begin 
      // 
      // Create an IShellItem from the supplied 
      // destination path. 
      // 
      Result := SHCreateItemFromParsingName(aDest, 
              nil, 
              IShellItem, psiTo); 
      end; 

      if Succeeded(Result) then 
      begin 
      // 
      // Add the operation 
      // 
      Result := lFileOperation.CopyItem(psiFrom, psiTo, aNewName, nil); 

      psiTo := nil; 
      end; 

      psiFrom := nil; 
     end; 

     if Succeeded(Result) then 
     begin 
      // 
      // Perform the operation to copy the file. 
      // 
      Result := lFileOperation.PerformOperations; 
     end; 
     end; 

     // 
     // Release the IFileOperation interface. 
     // 
     lFileOperation := nil; 
    end; 

    CoUninitialize; 
    end; 
end; 

免責聲明: IFileOperation.CopyItem可從Windows Vista和更高。所以上面的例子只適用於Delphi 2010(和2009?)。由於我使用的是Delphi 7,因此我無法編譯它,因爲我缺少ShlObj單元的最新版本。從Delphi使用COM很容易,因此轉換示例並不是什麼大問題。我搜索了IFileOperation的CLSID,所以我不知道它是否是正確的。

如果你真的希望這用Delphi 7工作,你必須有IFileOperation的定義。 Jeroen提供的鏈接具有IShellItem的定義,但不適用於IFileOperation。如果你知道某人有一個Delphi 2010的版本,你可以問他ShlObj.pas(但它是有版權的,所以你必須Shobjidl.h自己翻譯或等待別人去做,你可以檢查的項目JEDI)。

當這一切似乎很複雜,嘗試Windows API調用,CopyFile

+0

這是一個很好的翻譯,但你不需要刪除接口。接口引用被重新計數,Delphi編譯器將在函數結束時超出範圍時自動釋放它們。 – 2010-07-14 18:57:44

+0

@Mason Wheeler:我知道,但我只是翻譯了MSDN的例子。因此,在MSDN示例稱爲發佈的地方,我剔除了它們。只是爲了展示你如何在Delphi中做到這一點,雖然它是多餘的。 – 2010-07-15 06:41:13