フォルダをコピーする方法
◆概要
このページは、Visual Basic 6.0でフォルダをコピーする方法について記載しています。
VB6.0でフォルダをコピーする方法には、ファイルシステムオブジェクトを使う方法と、Win32 APIを使う方法があります。
◆ファイルシステムオブジェクトでフォルダをコピーする方法
FileSystemObjectオブジェクトのCopyFolderメソッドを使って、フォルダをコピーします。CopyFolderメソッドの引数は、コピー元のフォルダ名、コピー先のフォルダ名、上書き可否を示すブール型の順で指定します。
VBからファイルシステムオブジェクトを使うために、[プロジェクト]メニューの[参照設定]ダイアログボックスで、[Microsoft Scripting Runtime]を選択しておきます。
Private Sub Command1_Click() ' FileSystemObject のインスタンスを取得します。 Dim fso As New FileSystemObject 'コピー元フォルダをコピー先にコピー 'コピー元 D:\Temp、コピー先D:\work 'コピー先に同名のフォルダがあればエラー With fso .CopyFolder "D:\Temp", "D:\work", False End With End Sub |
この例では、上書き可否の引数にFalseを設定していますので、コピー先に同名のフォルダがある場合はエラーが発生します。
上書きするかどうかをユーザーに確認したいときは、エラーをトラップして独自のエラー処理が必要になります。また、進行状況を示すダイアログは表示されません。
◆Win32 API関数を使ってフォルダをコピーする方法
SHFileOperation()関数を使って、フォルダをコピーします。
標準モジュール
Option Explicit 'ファイルを操作する関数の宣言 Declare Function SHFileOperation Lib "shell32.dll" Alias _ "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long ' どの操作を行うかを示す定数の宣言 Public Const FO_COPY = &H2& Public Const FOF_ALLOWUNDO = &H40& 'ファイル操作に関する情報を定義する構造体 Type SHFILEOPSTRUCT hWnd As Long wFunc As Long pFrom As String pTo As String fFlags As Long fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type |
フォームモジュール
Private Sub Command1_Click() Dim utdShellOpStruct As SHFILEOPSTRUCT Dim lngWin32apiResultCode As Long 'ファイル操作に関する情報を指定 With utdShellOpStruct '進行状況を表示するダイアログの '親ウィンドウハンドルを指定 .hWnd = Form1.hWnd '実行する操作に[コピー]を指定 .wFunc = FO_COPY 'コピー元のフォルダを指定 .pFrom = "D:\Temp" 'コピー先のフォルダを指定 .pTo = "D:\Work" 'ファイル操作のフラグを指定 .fFlags = FOF_ALLOWUNDO End With 'ファイル操作を実行 lngWin32apiResultCode = SHFileOperation(utdShellOpStruct) End Sub |
SHFileOperation()関数の引数に渡すSHFILEOPSTRUCT構造体のfFlagsメンバーには、定数FOF_ALLOWUNDO(値は&H40&)を指定していますので、コピー先に同じ名前のフォルダやファイルが存在すれば、上書きを確認するダイアログボックスが自動的に表示されます。
Windows Xp の場合
Windows Vista の場合
また、時間を要する処理が行われる時には、進行状況を表示するダイアログボックスも自動的に表示されます。
Windows Xp の場合
Windows Vista の場合