のにっき

【C#】フォルダの高速コピー

今回は、フォルダの高速コピーをご紹介します。
フォルダのコピーとは、
サブフォルダも含めたすべてのファイルをコピーする
やり方になります。
再帰処理と並列処理を同関数で行っているので、
勉強中の方は処理の動きをご参考いただければ嬉しいです!

参考サイト

基本的な構文はこのサイトを参考にしました。
並列処理を追加したら高速になるなーの考えでちょっとだけ改造してます。
dobon.net

ソースコード

        /// <summary>
        /// サブフォルダを含むフォルダのコピー
        /// </summary>
        /// <param name="CopyFldName">コピーするフォルダパス</param>
        /// <param name="PasteFldName">コピー先のフォルダパス</param>
        public static void Set_CopyDirectory(string CopyFldName, string PasteFldName)
        {
            //コピー先のディレクトリがないときは作成
            if (!Directory.Exists(PasteFldName))
            {
                Directory.CreateDirectory(PasteFldName);              
                File.SetAttributes(PasteFldName, File.GetAttributes(CopyFldName));
            }
            //コピー先のディレクトリ名の末尾に"\"をつける
            if (PasteFldName[PasteFldName.Length - 1] != Path.DirectorySeparatorChar)
            {
                PasteFldName = PasteFldName + Path.DirectorySeparatorChar;
            }
            //コピー元のディレクトリにあるファイルをコピー ※ここで並列処理
            string[] files = Directory.GetFiles(CopyFldName);
            Parallel.ForEach(files, (file) =>
            {
                File.Copy(file, PasteFldName + Path.GetFileName(file), true);
            });
            //コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す
            string[] dirs = Directory.GetDirectories(CopyFldName);
            foreach (string dir in dirs)
            {
                Set_CopyDirectory(dir, PasteFldName + Path.GetFileName(dir));
            }
        }

以上がコピー処理を行う関数になります。
サブフォルダを考慮して再帰処理を行っている点と、
ファイルのコピーに並列処理を行っている点です。

以上、フォルダの高速コピーでした。