[C#][VB.NET] フォルダをコピーする方法(中身のファイルを含めて)

[C#][VB.NET] フォルダをコピーする方法(中身のファイルを含めて)

C#(VB.NET) でフォルダを中身ごとコピーしたい

.NET では中身の入ったフォルダのコピーは用意されていません。したがって自分で作ってやる必要があります。

以下実装です。

C

/// <summary>
/// ディレクトリの中身をコピーする
/// </summary>
/// <param name="sourcePath">コピー元パス</param>
/// <param name="destinationPath">コピー先パス</param>
/// <param name="overwrite">上書き可否</param>
/// <param name="copySubDirrectory">上書き可否</param>
public static void DirectoryCopy(string sourcePath, string destinationPath, bool overwrite = true, bool copySubDirrectory = true)
{
    var sourceDirectory = new DirectoryInfo(sourcePath);
    var destinationDirectory = new DirectoryInfo(destinationPath);

    // コピー元データの存在確認
    if (!sourceDirectory.Exists)
    {
        throw new DirectoryNotFoundException("コピーするディレクトリが存在しません。: " + sourcePath);
    }

    // ディレクトリの作成
    if (!destinationDirectory.Exists)
    {
        destinationDirectory.Create();
        destinationDirectory.Attributes = sourceDirectory.Attributes;
    }

    // ディレクトリの中身のファイルをコピー
    foreach (var file in sourceDirectory.GetFiles())
    {
        file.CopyTo(Path.Combine(destinationDirectory.FullName, file.Name), overwrite);
    }

    // 入れ子になったディレクトリを再帰的にコピー
    if (copySubDirrectory)
    {
        foreach (var directory in sourceDirectory.GetDirectories())
        {
            DirectoryCopy(
                directory.FullName,
                Path.Combine(destinationDirectory.FullName, directory.Name),
                overwrite,
                copySubDirrectory
            );
        }
    }
}

処理はコメントにある通りです。

コピー先のパスにディレクトリを作り、中身のファイルを1件ずつコピーします。

すべてのファイルコピーが終わればサブディレクトリをコピーします。再帰的に関数を呼び出せばOKです。

引数で上書き、サブディレクトリのコピーをそれぞれ可否を設定できます。

VB.NET

Public Shared Sub DirectoryCopy(ByVal sourcePath As String,
                                ByVal destinationPath As String,
                                ByVal overwrite As Boolean,
                                ByVal copySubDirectory As Boolean)

    Dim sourceDirectory = New DirectoryInfo(sourcePath)
    Dim destinationDirectory = New DirectoryInfo(destinationPath)

    If Not sourceDirectory.Exists() Then
        Throw New DirectoryNotFoundException("コピーするディレクトリが存在しません。: " + sourcePath)
    End If

    ' コピー先にディレクトリの作成
    If Not destinationDirectory.Exists() Then
        destinationDirectory.Create()
        destinationDirectory.Attributes = sourceDirectory.Attributes
    End If

    ' ディレクトリの中身のファイルをコピー
    For Each file In sourceDirectory.GetFiles()
        file.CopyTo(Path.Combine(destinationDirectory.FullName, file.Name), overwrite)
    Next

    ' サブディレクトリを再帰的にコピー
    If copySubDirectory Then
        For Each directory In sourceDirectory.GetDirectories()
            DirectoryCopy(directory.FullName, 
                          Path.Combine(destinationDirectory.FullName, directory.Name),
                          overwrite,
                          copySubDirectory)
        Next
    End If
End Sub

C# と同じなので解説は省略します。

以上。

C#カテゴリの最新記事