ファイル検索とコピー <TOP>
例ではC:\Tempフォルダ内の指定した拡張子を持つファイルを検索し、C:\Temp\Testフォルダへコピーします。
フォルダが存在しない場合は作成してコピーします。
CreateDirectory ディレクトリの新規作成
CopyFile ファイルのコピー
FindFirstFile 指定したファイル名に一致するファイルやディレクトリを検索
FindNextFile FindFirstFile()関数で検出したファイルの次を検出
FindClose ファイル検索ハンドルをクローズ
Tempにtestフォルダが作成され、ファイルがコピーされた状態を示しています。
'================================================================ '= ファイルコピー '= (CopyFile.bas) '================================================================ #include "Windows.bi" #define INVALID_HANDLE_VALUE -1 '見つからない場合 #define MAX_PATH 260 Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type ' ディレクトリの新規作成 Declare Function Api_CreateDirectory& Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName$, lpSecurityAttributes As SECURITY_ATTRIBUTES) ' ファイルコピー Declare Function Api_CopyFile& Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName$, ByVal lpNewFileName$, ByVal bFailIfExists&) ' 指定したファイル名に一致するファイルやディレクトリを検索 Declare Function Api_FindFirstFile& Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName$, lpFindFileData As WIN32_FIND_DATA) ' FindFirstFile()関数で検出したファイルの次を検出 Declare Function Api_FindNextFile& Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile&, lpFindFileData As WIN32_FIND_DATA) ' ファイル検索ハンドルをクローズ Declare Function Api_FindClose& Lib "kernel32" Alias "FindClose" (ByVal hFindFile&) Var Shared List1 As Object Var Shared Edit(2) As Object Var Shared Text(3) As Object List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 For i = 0 To 3 If i < 3 Then Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14 Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14 Next '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Edit(0).SetWindowText "C:\Temp\" Edit(1).SetWindowText "C:\Temp\Test\" Edit(2).SetWindowText "*.lzh" End Sub '================================================================ '= '================================================================ Declare Function CopyFiles(sSourcePath As String, sDestination As String, sFiles As String) As Long Function CopyFiles(sSourcePath As String, sDestination As String, sFiles As String) As Long Var WFD As WIN32_FIND_DATA Var SA As SECURITY_ATTRIBUTES Var r As Long Var Ret As Long Var hFile As Long Var bNext As Long Var copied As Long Var currFile As String 'フォルダが存在しない場合は作成する Ret = Api_CreateDirectory(sDestination, SA) '目的フォルダ内を検索 hFile = Api_FindFirstFile(sSourcePath & sFiles, WFD) 'ファイルが見あたらない場合 If hFile = INVALID_HANDLE_VALUE Then Text(3).SetWindowText sFiles & " は、ありません!" Beep Wait 100 Exit Function End If '新しいディレクトリにファイルをコピー If hFile Then Do 'ファイルメイを取得 currFile = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr$(0))) 'ファイルコピー開始 Ret = Api_CopyFile(sSourcePath & currFile, sDestination & currFile, False) copied = copied + 1 'コピーしたファイルのチェック List1.AddString sSourcePath & currFile '次のファイルを検索 bNext = Api_FindNextFile(hFile, WFD) Loop until bNext = 0 End If 'クローズ Ret = Api_FindClose(hFile) 'コピーされたファイル数 CopyFiles = copied End Function '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var sSourcePath As String Var sDestination As String Var sFiles As String Var numCopied As Long '元フォルダ・複写先フォルダ・複写するファイルの種類 sSourcePath = Edit(0).GetWindowText sDestination = Edit(1).GetWindowText sFiles = Edit(2).GetWindowText List1.ResetContent 'コピーしたファイルをカウント numCopied = CopyFiles(sSourcePath, sDestination, sFiles) Text(3).SetWindowText Str$(numCopied) & "個のファイルをコピーしました!" End Sub '================================================================ '= '================================================================ Declare Sub Edit3_SetFocus edecl () Sub Edit3_SetFocus() List1.ResetContent Text(3).SetWindowText "" End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End