FileCopyEx
FileDelEx

APIの SHFileOperation() 関数を用いて、ファイルのコピー・移動・削除を行う関数です。
VBの標準機能と比較して、以下の利点があります。

・既に同名ファイル、フォルダが存在する場合に上書きの確認ダイアログが表示される
・同じフォルダ内にコピーした場合、自動で「〜(2)」のようにリネームされる
・ファイル操作に時間がかかる場合、進捗報告のダイアログが表示される
・サブフォルダを含めた一括操作が出来る
・ごみ箱を利用した削除が出来る

などなど。それほど利用は難しくないので、ぜひ積極的に利用したいAPIです。

'標準モジュールに記述します。

Option Explicit

'ファイル操作を行う
Private Declare Function SHFileOperation Lib "shell32.dll" _
    (lpFileOp As SHFILEOP) As Long

'SHFileOperation関数に渡すユーザー定義型
Type SHFILEOP
    hwnd As Long
    wFunc As Long
    pFrom As String
    pTo As String
    fFlags As Integer
    fAnyOperationsAborted As Long
    hNameMappings As Long
    lpszProgressTitle As String
End Type

Public Const FO_MOVE = &H1
Public Const FO_COPY = &H2
Public Const FO_DELETE = &H3
Public Const FOF_SILENT = &H4               '進行状況ダイアログを表示しない
Public Const FOF_ALLOWUNDO = &H40           'ごみ箱に送る
Public Const FOF_NOCONFIRMATION = &H10      '上書き・削除の確認ダイアログを表示しない
Public Const FOF_NOCONFIRMMKDIR = &H200     'コピー先フォルダが存在しない場合、確認せず作成

Public Sub FileCopyEx(lngHWnd As Long, strFromPath As String, strToPath As String)
'SHFileOperation関数を呼び出し、ファイル・フォルダをコピーする
'<引数>
'  lngHWnd     : フォームのウィンドウハンドル
'  strFromPath : コピー元のフルパス
'                複数ファイル・フォルダを対象にする場合は、それぞれの
'                フルパス名を vbNullChar で連結して指定します。
'  strToPath   : コピー先のフルパス

    Dim ShellOp As SHFILEOP
    Dim lngRet As Long
    Dim flg as Long

    'オプションスイッチの設定
    '進捗ダイアログ表示せず、上書き・フォルダ作成の確認をしない
    flg = FOF_SILENT + FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR

    With ShellOp
        .hwnd = lngHWnd
        .wFunc = FO_COPY
        .pFrom = strFromPath
        .pTo = strToPath
        .fFlags = flg
    End With

    lngRet = SHFileOperation(ShellOp)

End Sub

Public Sub FileDelEx(lngHWnd As Long, strFromPath As String, _
                     Optional blnUseTrash as Boolean = True)
'SHFileOperation関数を呼び出し、ファイル・フォルダをごみ箱に送るか削除する
'<引数>
'  lngHWnd     : フォームのウィンドウハンドル
'  strFromPath : 削除ファイル・フォルダのフルパス名
'  blnUseTrash : ごみ箱を使うかどうか(省略可能、初期値は「使用する」)

    Dim ShellOp As SHFILEOP
    Dim lngRet As Long
    Dim flg As Long

    'オプションスイッチの設定
    If blnUseTrash Then flg = FOF_ALLOWUNDO
    flg = flg + FOF_SILENT + FOF_NOCONFIRMATION

    With ShellOp
        .hwnd = lngHWnd
        .wFunc = FO_DELETE
        .pFrom = strFromPath
        .fFlags = flg
    End With

    lngRet = SHFileOperation(ShellOp)

End Sub

実行例:

'フォームにボタンを2つ用意して、以下のプロシージャを記述します。

Private Sub Command1_Click()
'「C:\Temp\」にある、「test1.txt」と「test2.txt」を「C:\Temp2\」にコピーします。
    Dim strFiles As String
    Dim strToPath As String

    'コピー元ファイル・フォルダの指定
    strFiles = "C:\Temp\test1.txt" & vbNullChar & "C:\Temp\test2.txt"
    
    'コピー先のパス
    strToPath = "C:\Temp2"
    
    Call FileCopyEx(Me.hwnd, strFiles, strToPath)
End Sub

Private Sub Command2_Click()
'「C:\Temp2\」をごみ箱に送ります。
    Dim strFiles As String

    '削除するパス
    strFiles = "C:\Temp2"

    Call FileDelEx(Me.hwnd, strFiles, True)
End Sub

***注意***

上記のサンプルは、エラーチェックをしていませんので、コピー・削除の対象となるパスが存在していないとエラーになります。
また、削除の確認も行わないオプションになっていますので、実行の際には誤って重要なファイルを消さないように気をつけてください。

戻る