Hmm, penso di aver frainteso la domanda, ma ho intenzione di rischiare. Cosa c'è di sbagliato nel seguente metodo semplice?
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));
}
EDIT Dal momento che questo post ha raccolto un numero impressionante di voti negativi per una risposta così semplice a una domanda altrettanto semplice, vorrei aggiungere una spiegazione. Si prega di leggere questo prima di effettuare il downgrade .
Prima di tutto, questo codice non è inteso come sostituzione drop-in al codice nella domanda. È solo a scopo illustrativo.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
esegue alcuni ulteriori test di correttezza (ad es. se l'origine e il target sono directory valide, se l'origine è un genitore del target ecc.) che mancano da questa risposta. Quel codice è probabilmente anche più ottimizzato.
Detto questo, il codice funziona bene . È stato (quasi identico) usato per anni in un software maturo. A parte l'intrinseca instabilità presente con tutti i gestori IO (ad esempio cosa succede se l'utente scollega manualmente l'unità USB mentre il codice vi sta scrivendo?), Non ci sono problemi noti.
In particolare, vorrei sottolineare che l'uso della ricorsione qui non è assolutamente un problema. Né in teoria (concettualmente, è la soluzione più elegante) né in pratica: questo codice non supererà lo stack . Lo stack è abbastanza grande da gestire anche gerarchie di file profondamente nidificate. Molto prima che lo spazio dello stack diventi un problema, entra in gioco la limitazione della lunghezza del percorso della cartella.
Si noti che un utente malintenzionato potrebbe essere in grado di rompere questo presupposto utilizzando directory profondamente annidate di una lettera ciascuna. Non ci ho provato. Ma solo per illustrare il punto: al fine di far traboccare questo codice su un tipico computer, le directory dovrebbero essere nidificate alcune migliaia di volte. Questo non è semplicemente uno scenario realistico.