ファイル検索とコピー          <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