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# と同じなので解説は省略します。
以上。
コメントを書く