相信大家做项目或者处理文件时候经常要用到备份的功能,这里给大家做一个可以同步更新文件夹内容并且备份的Winform程序,目前地址路径在App.Config文件里面设置,如需更改直接用记事本编辑即可,下面放代码和截图。

1.CS代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Configuration;
using System.Text.RegularExpressions;

namespace Update
{
    public partial class AutoUpdate : Form
    {
        string filePath = ConfigurationManager.AppSettings["FilePath"].ToString();
        string targetPath = ConfigurationManager.AppSettings["TargetPath"].ToString();
        string Timing = ConfigurationManager.AppSettings["Timing"].ToString();
        string backPath = ConfigurationManager.AppSettings["backUpPath"].ToString();
        int count = 0;

        string fullPath = "D:/backup/backup.txt";//设置日志地址

        public AutoUpdate()
        {
            InitializeComponent();

            this.txtFile.Text = filePath;
            this.txtTo.Text = targetPath;
            this.txtTime.Text = Timing;
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            //更新同时调用备份
            backup();

            if (filePath != "")
            {
                if (CopyDir(filePath, targetPath))
                {
                    MessageBox.Show("更新成功!!!");
                }
                else
                {
                    MessageBox.Show("更新失败!!!");
                }
            }
            else
            {
                MessageBox.Show("请正确设置源地址!");
            }
        }

        /// <summary>
        /// 更新文件处理
        /// </summary>
        /// <param name="srcPath"></param>
        /// <param name="aimPath"></param>
        /// <returns></returns>
        private bool CopyDir(string srcPath, string aimPath)
        {
            bool copyFile = false;
            try
            {
                // 检查目标目录是否以目录分割字符结束如果不是则添加 
                if (aimPath[aimPath.Length - 1] != System.IO.Path.DirectorySeparatorChar)
                {
                    aimPath += System.IO.Path.DirectorySeparatorChar;
                }
                // 判断目标目录是否存在如果不存在则新建 
                if (!System.IO.Directory.Exists(aimPath))
                {
                    System.IO.Directory.CreateDirectory(aimPath);
                }
                // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组 
                // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法 
                // string[] fileList = Directory.GetFiles(srcPath); 
                string[] fileList = System.IO.Directory.GetFileSystemEntries(srcPath);
                string str = "";
                if (count == 0)
                {
                    str = DateTime.Now.ToString() + "------";
                }

                // 遍历所有的文件和目录 
                foreach (string file in fileList)
                {
                    // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 
                    if (System.IO.Directory.Exists(file))
                    {
                        CopyDir(file, aimPath + System.IO.Path.GetFileName(file));
                        if (count == 0)
                        {
                            str += file + ",";
                        }
                    }
                    // 否则直接Copy文件 
                    else
                    {
                        System.IO.File.Copy(file, aimPath + System.IO.Path.GetFileName(file), true);
                        if (count == 0)
                        {
                            str += file + ",";
                        }
                    }
                }

                if (System.IO.File.Exists(fullPath))
                {
                    using (StreamWriter sw = new StreamWriter(fullPath, true, Encoding.Default))
                    {
                        sw.WriteLine(str);
                    }
                }
                else
                {
                    File.Create(fullPath).Close();

                    using (StreamWriter sw = new StreamWriter(fullPath, true, Encoding.Default))
                    {
                        sw.WriteLine(str);
                    }
                }
                copyFile = true;

            }
            catch (Exception e)
            {
                //MessageBox.Show(e.ToString());
            }
            return copyFile;
        }

        /// <summary>
        /// 恢复
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRestoration_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dialog = new FolderBrowserDialog();
            dialog.Description = "请选择文件路径";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                string foldPath = dialog.SelectedPath;
                //this.txtFile.Text = foldPath;
                if (CopyDir(foldPath, targetPath))
                {
                    MessageBox.Show("恢复成功!");
                }
                else
                {
                    MessageBox.Show("恢复失败!");
                }
            }
        }

      /// <summary>
      /// 定时
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
        private void btnTimeUpdate_Click(object sender, EventArgs e)
        {
            string dt = DateTime.Now.ToString("HH:mm");
            string ver = "^((0[0-9]|1[0-9]|2[0-3]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]))$";
            timer.Interval = 30000;

            //判断是否选中
            if (!chbUpdate.Checked)
            {
                txtTime.Enabled = true;
            }
            else
            {
                txtTime.Enabled = false;
            }


            if (Timing != "" && Regex.IsMatch(Timing, ver))
            {
                if (dt == Timing)
                {
                    timer.Tick += new EventHandler(timer_Tick);
                }
            }
            else
            {
                MessageBox.Show("请正确填写时间!");
                this.chbUpdate.Checked = false;
                this.txtTime.Text = "";
            }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            backup();
            CopyDir(filePath, targetPath);
            this.Close();
        }

        
        /// <summary>
        /// 查看日志
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLog_Click(object sender, EventArgs e)
        {          
            if (File.Exists(fullPath))
            {
                System.Diagnostics.Process.Start(fullPath);
            }
            else
            {
                File.Create(fullPath).Close();
                System.Diagnostics.Process.Start(fullPath);
            }
        }

        /// <summary>
        /// Backup
        /// </summary>
        public void backup()
        {
            count = 1;
            if (Directory.Exists(backPath))
            {
                DirectoryInfo dirpath = Directory.CreateDirectory(backPath + DateTime.Now.ToString("yyyy-MM-dd"));
                string backFile = dirpath.FullName.ToString();
                CopyDir(targetPath, backFile);
            }
            else
            {
                Directory.CreateDirectory(backPath);
                DirectoryInfo dirpath = Directory.CreateDirectory(backPath + DateTime.Now.ToString("yyyy-MM-dd"));
                string backFile = dirpath.FullName.ToString();
                CopyDir(targetPath, backFile);
            }
            count = 0;
        }
    }
}

2.App.config文件代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!--源地址-->
    <add key="FilePath" value="C:\Users\xiaobai\Desktop\新建文件夹"/>
    <!--目标地址-->
    <add key="TargetPath" value="D:\test\" />
    <!--备份地址-->
    <add key="backUpPath" value="D:\backup\" />
    <!--设置定时时间-->
    <add key="Timing" value="14:50" />
  </appSettings>
</configuration>

3.截图:



本文转载:CSDN博客