MoveFileはファイル・フォルダのどちらにも対応していますが、
CopyFileはファイルだけにしか対応していません。
フォルダのコピーは、フォルダは自力で作成し
中のファイルはCopyFileで全てコピーするという面倒な方法と
『SHFileOperation』を使う方法があります。
SHFileOperationを使った例:
#uselib "shell32.dll"
#func SHFileOperation "SHFileOperationA" var
#uselib "user32.dll"
#cfunc GetDesktopWindow "GetDesktopWindow"
// 操作の定数
#define FO_MOVE 0x0001 // 移動
#define FO_COPY 0x0002 // コピー
#define FO_DELETE 0x0003 // 削除
#define FO_RENAME 0x0004 // 名前の変更
// 操作オプション定数
#define FOF_MULTIDESTFILES 0x0001 // 操作後のファイル名に複数のファイルを指定している
#define FOF_CONFIRMMOUSE 0x0002 // (廃止された)
#define FOF_SILENT 0x0004 // 進行状況を表示するダイアログを表示しない
#define FOF_RENAMEONCOLLISION 0x0008 // 移動、コピー、名前の変更で名前が既存だった場合は新しい名前を付ける
#define FOF_NOCONFIRMATION 0x0010 // ダイアログで『はい』または『すべて』を選択する
#define FOF_WANTMAPPINGHANDLE 0x0020 // FOF_RENAMEONCOLLISIONのオプションがある場合、旧名と新名を記録する
#define FOF_ALLOWUNDO 0x0040 // 『元に戻す』情報を保持する
#define FOF_FILESONLY 0x0080 // ワイルドカードファイル(*.*)が指定された場合のみ操作実行
#define FOF_SIMPLEPROGRESS 0x0100 // 進行状況を表示するダイアログにファイル名を表示しない
#define FOF_NOCONFIRMMKDIR 0x0200 // 新しいディレクトリを作成するときに確認しない
#define FOF_NOERRORUI 0x0400 // エラー時にユーザーインターフェイスを表示しない
#define FOF_NOCOPYSECURITYATTRIBS 0x0800 // ファイルのセキュリティ属性をコピーしない
#define FOF_NORECURSION 0x1000 // ローカルディレクトリのみに操作し、サブディレクトリには操作をしない
#define FOF_NO_CONNECTED_ELEMENTS 0x2000 // グループとして接続されているファイルを移動しない
#define FOF_WANTNUKEWARNING 0x4000 // ごみ箱に入れるのではない削除操作のときに警告をする
#define FOF_NORECURSEREPARSE 0x8000 // リパースポイントをコンテナではなくオブジェクトとして扱う
sdim pFrom, 260;
sdim pTo, 260;
pFrom = "C:\\TEST"; // コピー元のフルパス
pTo = "C:\\TEST_COPY"; // コピー先のフルパス
dim SHFILEOPSTRUCT, 8; // SHFILEOPSTRUCT構造体
SHFILEOPSTRUCT(0) = GetDesktopWindow(); // 進行状況を表示するダイアログのオーナーウィンドウハンドル
SHFILEOPSTRUCT(1) = FO_COPY; // ファイル(もしくはディレクトリ)のコピー
SHFILEOPSTRUCT(2) = varptr(pFrom); // 操作元(コピー元)のパスの文字列へのポインタ
SHFILEOPSTRUCT(3) = varptr(pTo); // 操作後(コピー後)のパスの文字列へのポインタ
SHFILEOPSTRUCT(4) = FOF_RENAMEONCOLLISION | FOF_NOCONFIRMATION; // 操作オプション
SHFILEOPSTRUCT(5) = fAnyOperationsAborted; // 操作がユーザーによって中止された場合は1、その他は0が入る
SHFILEOPSTRUCT(6) = 0; // オプションにFOF_WANTMAPPINGHANDLEを使っている場合、ここで指定した変数に記録される
SHFILEOPSTRUCT(7) = 0; // オプションにFOF_SIMPLEPROGRESSを使っている場合、ダイアログのタイトルバーの文字列になる
SHFileOperation SHFILEOPSTRUCT; // コピー実行
if( stat == 0 ) {
mes "コピー操作に成功しました";
}
else {
mes "コピー操作に失敗しました";
}
定数が多くて長く見えますが、不要な定数は消して使ってください。