Attribute VB_Name = "xSHFileOperation関数"
' @(h) xSHFileOperation関数.bas ver 1.0 ( '98.10.15 )
' @(s)
' フォルダの操作を行うモジュール
' 本モジュールはテスト用コードモジュールです。
' 注意).本API関数はOSR2以前のバージョンでは使用できません。
' 但し、どうしても使いたいときはIE4.01以降をインストールしてください。
'
Option Explicit
'' API関数定義
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
'' 命令
Public Const FO_COPY = &H2 '' ファイルをコピー
Public Const FO_DELETE = &H3 '' ファイルを削除
Public Const FO_MOVE = &H1 '' ファイルを移動
Public Const FO_RENAME = &H4 '' ファイル名を変更
'' オプション
Public Const FOF_ALLOWUNDO = &H40 '' 可能な場合、アンドゥ情報を保存する
Public Const FOF_CONFIRMMOUSE = &H2 ''
Public Const FOF_FILESONLY = &H80 '' コピー元ファイル名に"."が指定したことを示す
Public Const FOF_MULTIDESTFILES = &H1 '' pToに複数のコピー先を指定したことを示す
Public Const FOF_NOCONFIRMATION = &H10 '' 問い合わせに対して「はい」を選んだことにする
Public Const FOF_NOCONFIRMMKDIR = &H200 '' 新しいディレクトリを作るようなことはしない。
Public Const FOF_RENAMEONCOLLISION = &H8 '' コピー先に同じ名前があるときは「のコピー1」というような名前にする
Public Const FOF_SILENT = &H4 '' 進行状況を示すダイアログを表示しない。
Public Const FOF_SIMPLEPROGRESS = &H100 '' 進行状況を示すダイアログにファイル名を表示しない
Public Const FOF_WANTMAPPINGHANDLE = &H20 ''
'' SHFILEOPSTRUCT
Type SHFILEOPSTRUCT
hwnd As Long '' ハンドル=0でよい
wFunc As Long '' 命令
pFrom As String '' コピー元
pTo As String '' コピー先
fFlags As Integer '' オプション
fAnyOperationsAborted As Long '' ? - 失敗したときに呼び出す関数のアドレス?
hNameMappings As Long '' ? - 名前を出力するハンドル?
lpszProgressTitle As String ' only used if FOF_SIMPLEPROGRESS(=0)
End Type
Sub xSHFileOperationのテスト()
Dim xPath As String
Dim I As Long
Dim xFreeFile As Long
xPath = ActiveWorkbook.Path '' エクセルを前提にしてます。
'' ハードディスクは90MB以上必要です。
On Error Resume Next
MkDir xPath & "\テストフォルダ"
MkDir xPath & "\テストフォルダ\test1"
On Error GoTo 0
MsgBox "「" & xPath & "\テストフォルダ\test1」を作成しましたので確認してください。"
xFreeFile = FreeFile
Open xPath & "\テストフォルダ\test1\TEST01.BIN" For Output As #xFreeFile
Print #xFreeFile, String(3000000, "X")
Close #xFreeFile
For I = 2 To 10 Step 1
FileCopy xPath & "\テストフォルダ\test1\TEST01.BIN", xPath & "\テストフォルダ\test1\TEST" & Right$("00" & I, 2) & ".BIN"
Next I
MsgBox "10ファイル作成しました。「" & xPath & "\テストフォルダ\test1」を確認してください。"
xDirCopy xPath & "\テストフォルダ\test1", xPath & "\テストフォルダ\test2"
xDirCopy2 xPath & "\テストフォルダ\test1", xPath & "\テストフォルダ\test3"
MsgBox "「" & xPath & "\テストフォルダ\test1」をコピーして「test2」と「test3」を作成しました。確認してください。"
xDirRename xPath & "\テストフォルダ\test3", xPath & "\テストフォルダ\test456fg"
MsgBox "「" & xPath & "\テストフォルダ\test3」を「test456fg」にリネームしました。確認してください。"
xDirMove xPath & "\テストフォルダ\test456fg", xPath & "\テストフォルダ\test1"
MsgBox "「" & xPath & "\テストフォルダ\test456fg」を「test1」に移動しました。確認してください。"
xDirDelete xPath & "\テストフォルダ"
MsgBox "「" & xPath & "\テストフォルダ」を削除しました。確認してください。"
End Sub
' @(f)
'
' 機能 : フォルダを削除する。
'
' 返り値 : なし
'
' 引き数 : xFromFile - 削除するフォルダ名
'
' 機能説明 : フォルダを削除する。(アンドゥ情報は保存しません)
'
' 備考 : 特になし
'
Function xDirDelete(ByVal xFromFile As String)
Dim shfos As SHFILEOPSTRUCT
Dim result As Long
Dim AnyOperationsAborted As Long
Dim NameMappings As Long
With shfos
.hwnd = 0
.wFunc = FO_DELETE
.pFrom = xFromFile
.pTo = ""
.fFlags = 0
.fAnyOperationsAborted = AnyOperationsAborted
.hNameMappings = NameMappings
.lpszProgressTitle = 0
End With
result = SHFileOperation(shfos)
DoEvents
End Function
' @(f)
'
' 機能 : フォルダを移動する。
'
' 返り値 : なし
'
' 引き数 : xFromFile - 移動元フォルダ名
' xToFile - 移動先フォルダ名
'
' 機能説明 : フォルダを移動する。(アンドゥ情報は保存しません)
'
' 備考 : 特になし
'
Function xDirMove(ByVal xFromFile As String, ByVal xToFile As String)
Dim shfos As SHFILEOPSTRUCT
Dim result As Long
Dim AnyOperationsAborted As Long
Dim NameMappings As Long
With shfos
.hwnd = 0
.wFunc = FO_MOVE
.pFrom = xFromFile
.pTo = xToFile
.fFlags = 0
.fAnyOperationsAborted = AnyOperationsAborted
.hNameMappings = NameMappings
.lpszProgressTitle = 0
End With
result = SHFileOperation(shfos)
DoEvents
End Function
' @(f)
'
' 機能 : フォルダ名をかえる。
'
' 返り値 : なし
'
' 引き数 : xFromFile - 元のフォルダ名
' xToFile - 先のフォルダ名
'
' 機能説明 : フォルダ名をかえる。(アンドゥ情報は保存しません)
'
' 備考 : 特になし
'
Function xDirRename(ByVal xFromFile As String, ByVal xToFile As String)
Dim shfos As SHFILEOPSTRUCT
Dim result As Long
Dim AnyOperationsAborted As Long
Dim NameMappings As Long
With shfos
.hwnd = 0
.wFunc = FO_RENAME
.pFrom = xFromFile
.pTo = xToFile
.fFlags = 0
.fAnyOperationsAborted = AnyOperationsAborted
.hNameMappings = NameMappings
.lpszProgressTitle = 0
End With
result = SHFileOperation(shfos)
DoEvents
End Function
' @(f)
'
' 機能 : フォルダをコピーする。
'
' 返り値 : なし
'
' 引き数 : xFromFile - コピー元のフォルダ名
' xToFile - コピー先のフォルダ名
'
' 機能説明 : フォルダをコピーする。(コピー情報を表示しません。)
'
' 備考 : 特になし
'
Function xDirCopy2(ByVal xFromFile As String, ByVal xToFile As String)
Dim shfos As SHFILEOPSTRUCT
Dim result As Long
Dim AnyOperationsAborted As Long
Dim NameMappings As Long
With shfos
.hwnd = 0
.wFunc = FO_COPY
.pFrom = xFromFile
.pTo = xToFile
.fFlags = FOF_SILENT
.fAnyOperationsAborted = AnyOperationsAborted
.hNameMappings = NameMappings
.lpszProgressTitle = 0
End With
result = SHFileOperation(shfos)
DoEvents
End Function
' @(f)
'
' 機能 : フォルダをコピーする。
'
' 返り値 : なし
'
' 引き数 : xFromFile - コピー元のフォルダ名
' xToFile - コピー先のフォルダ名
'
' 機能説明 : フォルダをコピーする。(コピー情報を表示します。)
'
' 備考 : 特になし
'
Function xDirCopy(ByVal xFromFile As String, ByVal xToFile As String)
Dim shfos As SHFILEOPSTRUCT
Dim result As Long
Dim AnyOperationsAborted As Long
Dim NameMappings As Long
With shfos
.hwnd = 0
.wFunc = FO_COPY
.pFrom = xFromFile
.pTo = xToFile
.fFlags = 0
.fAnyOperationsAborted = AnyOperationsAborted
.hNameMappings = NameMappings
.lpszProgressTitle = 0
End With
result = SHFileOperation(shfos)
DoEvents
End Function