ちょっと備忘録6 C#でディレクトリのバックアップ

拡張子を指定してディレクトリのバックアップを作成するコード
正直、自力でやるよりもrobocopyとか使ったほうがいいと思う。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace MyBackup
{
    public partial class Form1 : Form
    {
        private BackgroundWorker bw = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();

            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;

            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);

            //ProgressBarの最大値を100に設定
            progressBar1.Maximum = 100;
        }

        private void buttonExecute_Click(object sender, EventArgs e)
        {
            bw.RunWorkerAsync();
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            bw.CancelAsync();
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            var worker = (BackgroundWorker)sender;

            string srcDirLoot = @"c:\temp";
            string dstDirLoot = @"c:\work\test";

            // バックアップ対象のファイルの拡張子を指定する
            var srcfiles = getBackupFiles(srcDirLoot, new string[] { ".log" }).ToArray();
            int max = srcfiles.Length;
            int count = 0;

            foreach (string srcFileName in srcfiles)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                string dstFileName = srcFileName.Replace(srcDirLoot, dstDirLoot);
                string srcDir = Path.GetDirectoryName(srcFileName);
                string dstDir = Path.GetDirectoryName(dstFileName);

                if (!Directory.Exists(dstDir))
                {
                    // ディレクトリ作成
                    Directory.CreateDirectory(dstDir);
                    // 属性コピー
                    File.SetAttributes(dstDir, File.GetAttributes(srcDir));
                }

                File.Copy(srcFileName, dstFileName, true);

                double percent = (double)(count + 1) / (double)max * 100;
                worker.ReportProgress((int)percent);

                count++;
            }

        }

        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
                MessageBox.Show("キャンセルしました...");
            else
                MessageBox.Show("バックアップ完了!!");
        }

        public static IEnumerable<string> getBackupFiles(string srcDir, string[] searchPatterns)
        {
            var files = Directory.GetFiles(srcDir, "*.*", SearchOption.AllDirectories);
            var query = files.Where(file => searchPatterns.Any(pattern => file.ToLower().EndsWith(pattern)));

            return query;
        }

    }

}