[Delphi] エクスプローラのように履歴を残しながら、ファイルのコピーや移動を行う

SHFileOperation を利用すると、エクスプローラのように履歴を残しながらのコピーと移動が行えます。
さらにコピーのアニメーションまでします。応用でゴミ箱にファイルを削除することも可能です。
Shell 関係の API を利用するので、ShellAPI を uses に追加する必要があります。

以下のサンプル関数で、ファイルのコピーが可能です。
SHFileOpStruct構造体の値を変更することで、移動やゴミ箱に削除などの応用が可能です。
Win32 APIなので、文字列はPWideChar (非Unicode環境ではPChar)にキャストしています。

uses
  ShellAPI;

function FileCopy(Source, Destination: String): boolean;
var
  ShFileOpStruct: TSHFileOpStruct; 
begin
  with ShFileOpStruct do
  begin
    wnd := Application.Handle;
    wFunc := FO_COPY;                     // FO_MOVE であれば、移動になります
{$IFDEF UNICODE}
    pFrom := PWideChar(Source + #0);      // 移動元ファイル名
    pTo := PWideChar(Destination + #0);   // 移動先ファイル名
{$ELSE}
    pFrom := PChar(Source + #0);          // 移動元ファイル名
    pTo := PChar(Destination + #0);       // 移動先ファイル名
{$ENDIF}
    fFlags := FOF_ALLOWUNDO;              // できる限りアンドゥ情報を保持するように
    fAnyOperationsAborted := false;
    hNameMappings := nil;
    lpszProgressTitle := nil;
  end;

  // 正常終了であれば、Trueを返します
  Result := (SHFileOperation(ShFileOpStruct) = 0);
end;

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgramingFAQ_del0012