2

ディレクトリをコピーするために使用している次のコードがあります。

Private Sub CopyDirectory(ByVal sourcePath As String, ByVal destPath As String)
    If Not Directory.Exists(destPath) Then
        Directory.CreateDirectory(destPath)
    End If

    For Each file1 As String In Directory.GetFiles(sourcePath)
        Dim dest As String = Path.Combine(destPath, Path.GetFileName(file1))
        File.Copy(file1, dest)
    Next

    For Each dir1 As String In Directory.GetDirectories(Path.GetDirectoryName(sourcePath))
        Dim destdir As String = Path.Combine(destPath, Path.GetFileName(dir1))
        CopyDirectory(dir1, destdir)
    Next
End Sub

そして、これは私がメソッドを呼び出すCopyDirectory方法です:

 Dim sourcepath As String = "E:\Crazy\"
 Dim DestPath As String = "D:\Snippets\"
 CopyDirectory(sourcepath, DestPath,)

問題は、フォルダーを何度も継続的にコピーすることです。どうすればこれを止めることができますか? また、サブフォルダーを一度にコピーするにはどうすればよいですか? 再帰を使用しました。

4

1 に答える 1

6

あなたの問題はここにあります:

For Each dir1 As String In Directory.GetDirectories(Path.GetDirectoryName(sourcePath))

これにより、コピー元の正しいパスではなく、destPath の親フォルダーが取得されます。
また、File.Copyにも問題があります。ファイルが宛先パスに既に存在する場合、宛先を上書きする明示的な要求なしで File.Copy を呼び出すと、例外がスローされます。

Private Sub CopyDirectory(ByVal sourcePath As String, ByVal destPath As String)  

    If Not Directory.Exists(destPath) Then
        Directory.CreateDirectory(destPath)
    End If

    For Each file1 As String In Directory.GetFiles(sourcePath)
        Dim dest As String = Path.Combine(destPath, Path.GetFileName(file1))
        File.Copy(file1, dest, True)  ' Added True here to force the an overwrite 
    Next

    ' Use directly the sourcePath passed in, not the parent of that path
    For Each dir1 As String In Directory.GetDirectories(sourcePath)
        Dim destdir As String = Path.Combine(destPath, Path.GetFileName(dir1))
        CopyDirectory(dir1, destdir)
    Next
End Sub
于 2012-11-16T08:35:06.023 に答える