Hmm, acho que não entendi a pergunta, mas vou arriscar. O que há de errado com o seguinte método direto?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
EDITAR Como esta postagem recebeu um número impressionante de votos negativos por uma resposta tão simples a uma pergunta igualmente simples, deixe-me acrescentar uma explicação. Por favor, leia isso antes da votação .
Primeiro de tudo, esse código não pretende ser um substituto para o código da pergunta. É apenas para fins ilustrativos.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
faz alguns testes adicionais de correção (por exemplo, se a origem e o destino são diretórios válidos, se a origem é um pai do destino, etc.) que estão faltando nesta resposta. Esse código provavelmente também é mais otimizado.
Dito isto, o código funciona bem . Ele tem (quase idêntica) foi usado em um software maduro durante anos. Além da inconstância inerente presente em todos os manipuladores de E / S (por exemplo, o que acontece se o usuário desconectar manualmente a unidade USB enquanto seu código estiver gravando nela?), Não há problemas conhecidos.
Em particular, gostaria de salientar que o uso da recursão aqui não é absolutamente um problema. Nem na teoria (conceitualmente, é a solução mais elegante) nem na prática: esse código não sobrecarregará a pilha . A pilha é grande o suficiente para lidar com hierarquias de arquivos aninhadas profundamente. Muito antes de o espaço da pilha se tornar um problema, a limitação de comprimento do caminho da pasta entra em ação.
Observe que um usuário mal - intencionado pode quebrar essa suposição usando diretórios profundamente aninhados de uma letra cada. Eu não tentei isso. Mas apenas para ilustrar o ponto: para fazer esse código transbordar em um computador típico, os diretórios precisariam ser aninhados alguns milhares de vezes. Este simplesmente não é um cenário realista.