うーん、質問を誤解していると思いますが、危険を冒すつもりです。次の簡単な方法の何が問題になっていますか?
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));
}
編集この投稿は、同様に単純な質問に対するこのような単純な回答に対して、印象的な数の反対票を獲得したため、説明を追加させてください. 反対票を投じる前にこれを読んでください 。
まず第一に、このコードは、問題のコードを簡単に置き換えるものではありません。これは説明のみを目的としています。
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
この回答に欠けているいくつかの追加の正確性テスト (たとえば、ソースとターゲットが有効なディレクトリであるかどうか、ソースがターゲットの親であるかどうかなど) を行います。そのコードもおそらくより最適化されています。
とはいえ、コードはうまく機能します。何年もの間、成熟したソフトウェアで(ほぼ同じように)使用されてきました。すべての IO 処理に固有の不安定さ (たとえば、コードの書き込み中にユーザーが USB ドライブを手動で取り外すとどうなるか) を除けば、既知の問題はありません。
特に、ここでの再帰の使用はまったく問題ではないことを指摘したいと思います。理論的にも (概念的には、これが最も洗練されたソリューションです)、実際にも、このコードはスタックをオーバーフローしません。スタックは、深くネストされたファイル階層を処理するのに十分な大きさです。スタック スペースが問題になるずっと前に、フォルダー パスの長さの制限が開始されます。
悪意のあるユーザーは、1 文字ずつ深くネストされたディレクトリを使用することで、この仮定を破ることができることに注意してください。私はこれを試していません。しかし、要点を説明すると、このコードを一般的なコンピューターでオーバーフローさせるには、ディレクトリを数千回ネストする必要があります。これは現実的なシナリオではありません。