ちょっと備忘録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; } } }