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