VB.NETフォルダをコピーする

スポンサーリンク

.NET Framework には、ディレクトリ (フォルダ) 内をすべてコピーするようなメソッドは用意されていません。手動でディレクトリを作成し、配下にあるすべてのディレクトリとファイルをコピーすることになります。

以下は、その処理をメソッド化したものです。再帰呼び出しを使って、配下にあるすべてのディレクトリとファイルをコピーしています。第 3 引数の "上書き指定" によって同名のファイルの上書きを指定することができます。

サンプルコード

以下にサンプルコードを示します。

VB.NET 全般
''' ------------------------------------------------------------------------------------
''' <summary>
'''     ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。
'''     新しい場所に同名のファイルがある場合は上書きしません。<summary>
''' <param name="stSourcePath">
'''     コピー元のディレクトリのパス。</param>
''' <param name="stDestPath">
'''     コピー先のディレクトリのパス。</param>
''' ------------------------------------------------------------------------------------
Public Shared Overloads Sub CopyDirectory(ByVal stSourcePath As String, ByVal stDestPath As String)
    CopyDirectory(stSourcePath, stDestPath, False)
End Sub

''' ------------------------------------------------------------------------------------
''' <summary>
'''     ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。<summary>
''' <param name="stSourcePath">
'''     コピー元のディレクトリのパス。</param>
''' <param name="stDestPath">
'''     コピー先のディレクトリのパス。</param>
''' <param name="bOverwrite">
'''     コピー先が上書きできる場合は True。それ以外の場合は False。</param>
''' ------------------------------------------------------------------------------------
Public Shared Overloads Sub CopyDirectory(ByVal stSourcePath As String, ByVal stDestPath As String, ByVal bOverwrite As Boolean)
    ' コピー先のディレクトリがなければ作成する
    If System.IO.Directory.Exists(stDestPath) = False Then
        System.IO.Directory.CreateDirectory(stDestPath)
        System.IO.File.SetAttributes(stDestPath, System.IO.File.GetAttributes(stSourcePath))
        bOverwrite = True
    End If

    ' コピー元のディレクトリにあるすべてのファイルをコピーする
    If bOverwrite Then
        For Each stCopyFrom As String In System.IO.Directory.GetFiles(stSourcePath)
            Dim stCopyTo As String = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom))
            System.IO.File.Copy(stCopyFrom, stCopyTo, True)
        Next stCopyFrom

    ' 上書き不可能な場合は存在しない時のみコピーする
    Else
        For Each stCopyFrom As String In System.IO.Directory.GetFiles(stSourcePath)
            Dim stCopyTo As String = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom))

            If System.IO.File.Exists(stCopyTo) = False Then
                System.IO.File.Copy(stCopyFrom, stCopyTo, False)
            End If
        Next stCopyFrom
    End If

    ' コピー元のディレクトリをすべてコピーする (再帰)
    For Each stCopyFrom As String In System.IO.Directory.GetDirectories(stSourcePath)
        Dim stCopyTo As String = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom))
        CopyDirectory(stCopyFrom, stCopyTo, bOverwrite)
    Next stCopyFrom
End Sub

使用例は以下のようになります。

VB.NET 全般
    // フォルダをコピーする (コピー先に同名のファイルがある場合は上書きしない)
    CopyDirectory("C:\Hoge\", "C:\Foo\");

    // フォルダをコピーする (コピー先に同名のファイルがある場合は上書きする)
    CopyDirectory("C:\Hoge\", "C:\Bar\", True);

関連するリファレンス

準備中です。

スポンサーリンク