VB.NET Tips - フォルダコピー(サブフォルダ以下も含む)

指定されたコピー先のフォルダに、コピー元のフォルダ名の中身を全てコピーする関数です。 コピー先のフォルダが存在しない場合は、作成します。 最初にコピー元のフォルダ内のファイルを全てコピー先にコピーを行います。 コピー元のフォルダ内のファイル一覧を取得には System.IO.Directory.GetFiles を用います。
その後で、コピー元のフォルダ内のサブフォルダの一覧を取得し、自分自身を再帰的にコールすることで コピーを行います。サブフォルダの一覧の取得は System.IO.Directory.GetDirectories を用います。

System.IO.Directory.GetFiles 関数について

Public Shared Function GetFiles (path As String) As String()
path:
    検索するディレクトリの相対パスまたは絶対パス。 この文字列の大文字と小文字は区別されません。
戻り値:
    指定したディレクトリ内のファイルの完全名 (パスを含む) の配列。
    ファイルが見つからない場合は空の配列。(空と言うことはLengthが 0 のString配列)

System.IO.Directory.GetDirectories 関数について

Public Shared Function GetDirectories (path As String) As String()
path:
    検索するディレクトリの相対パスまたは絶対パス。 この文字列の大文字と小文字は区別されません。
戻り値:
    指定したパス内のサブディレクトリのフルネーム (パスを含む) の配列。
    ディレクトリが見つからない場合は空の配列。(空と言うことはLengthが 0 のString配列)

フォルダコピー関数

    ''' -----------------------------------------------------------------------
    ''' 
    ''' フォルダコピー(サブフォルダ以下も含む)
    ''' 
    ''' コピー元フォルダ
    ''' コピー先フォルダ
    ''' True:正常, False:エラー
    ''' -----------------------------------------------------------------------
    Function CopyFolder(ByVal astrSrcFolderName As String, ByVal astrDesFolderName As String) As Boolean
        '戻り値初期化
        CopyFolder = False
        Try
            'コピー先のフォルダがないときは作る
            If Not System.IO.Directory.Exists(astrDesFolderName) Then
                System.IO.Directory.CreateDirectory(astrDesFolderName)
                '属性もコピー
                System.IO.File.SetAttributes(astrDesFolderName, System.IO.File.GetAttributes(astrSrcFolderName))
            End If

            'コピー先のフォルダ名の末尾に"\"をつける
            If astrDesFolderName.Chars((astrDesFolderName.Length - 1)) <> System.IO.Path.DirectorySeparatorChar Then
                astrDesFolderName &= System.IO.Path.DirectorySeparatorChar
            End If

            'コピー元のフォルダにあるファイルをコピー
            Dim ArrFiles As String() = System.IO.Directory.GetFiles(astrSrcFolderName)
            Dim strFile As String
            For Each strFile In ArrFiles
                System.IO.File.Copy(strFile, astrDesFolderName + System.IO.Path.GetFileName(strFile), True)
            Next

            'コピー元のフォルダにあるフォルダをコピー(再帰呼出)
            Dim ArrDirs As String() = System.IO.Directory.GetDirectories(astrSrcFolderName)
            Dim strDir As String
            For Each strDir In ArrDirs
                If CopyFolder(strDir, astrDesFolderName + System.IO.Path.GetFileName(strDir)) = False Then
                    '再帰呼出での内部のフォルダのコピーがエラーの場合
                    Return False
                End If
            Next

            '正常終了
            Return True

        Catch ex As Exception
            'エラー処理が必要な場合は、ここに記述する
        End Try
    End Function