真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用C#實現(xiàn)一個差異文件備份工具-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關使用C#實現(xiàn)一個差異文件備份工具,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供江海企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、做網(wǎng)站H5網(wǎng)站設計、小程序制作等業(yè)務。10年已為江海眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。

如歌曲、視頻、文檔,代碼文件等等,如果經常增加刪除修改文件,就需要定期備份,最早之前文件都不大的時候我都是手工先全部刪除,然后再全部拷貝,感覺比較保險。后來有了很大的電影文件和很瑣碎的代碼文件之后,這樣搞太折磨人,就學網(wǎng)上說的用Xcpoy組裝了一個批處理。學了C#后,感覺還是做一個GUI體驗更好用起來更方便。至于專業(yè)的工具,還真沒怎么試過,有點不放心吧,有好用的倒是可以試試。現(xiàn)在先自己做一個用著吧。

使用C#實現(xiàn)一個差異文件備份工具

關鍵代碼如下:

private async void btnBackUp_Click(object sender, EventArgs e)
    {
      string sourceDirectory = txtSource.Text;
      string targetDirectory = txtTarget.Text;
      if (sourceDirectory.ToLower() == targetDirectory.ToLower())
      {
        Console.WriteLine("源目錄和備份目錄不能是同一目錄!");
        MessageBox.Show("源目錄和備份目錄不能是同一目錄!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
      }
      DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);  // 源目錄
      DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);  // 備份目錄
      if (diTarget.Name != diSource.Name)
        diTarget = new DirectoryInfo(Path.Combine(diTarget.FullName, diSource.Name));  // 創(chuàng)建同名目錄
      if (!diTarget.Exists) diTarget.Create();  // 如果該目錄已存在,則此方法不執(zhí)行任何操作
      btnBackUp.Enabled = false;
      txtSource.Enabled = false;
      txtTarget.Enabled = false;
      lblWork.Text = "備份開始!";
      if (await CopyAllAsync(diSource, diTarget))
      {
        lblWork.Text = "備份完成!";
        MessageBox.Show("備份完畢!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
      }
      else lblWork.Text = "出現(xiàn)錯誤!";
      btnBackUp.Enabled = true;
      txtSource.Enabled = true;
      txtTarget.Enabled = true;
      btnBackUp.Focus();
    }

    public async Task CopyAllAsync(DirectoryInfo source, DirectoryInfo target)
    {
      try
      {
        foreach (FileInfo fi in source.GetFiles())  // 復制最新文件
        {
          Console.WriteLine(@"準備復制文件 {0}\{1}", target.FullName, fi.Name);  // Name不含路徑,僅文件名
          FileInfo newfi = new FileInfo(Path.Combine(target.FullName, fi.Name));
          if (!newfi.Exists || (newfi.Exists && fi.LastWriteTime > newfi.LastWriteTime))
          {
            Console.WriteLine("正在復制文件 {0}", newfi.FullName);
            lblWork.Text = string.Format("正在復制文件 {0}", newfi.FullName);
            if (newfi.Exists && newfi.IsReadOnly) newfi.IsReadOnly = false;
            // 覆蓋或刪除只讀文件會產生異常:對路徑“XXX”的訪問被拒絕
            fi.CopyTo(newfi.FullName, true);  // Copy each file into it's new directory
          }
        }

        foreach (FileInfo fi2 in target.GetFiles())  // 刪除源目錄沒有而目標目錄中有的文件
        {
          FileInfo newfi2 = new FileInfo(Path.Combine(source.FullName, fi2.Name));
          if (!newfi2.Exists)
          {
            Console.WriteLine("正在刪除文件 {0}", fi2.FullName);
            lblWork.Text = string.Format("正在刪除文件 {0}", fi2.FullName);
            if (fi2.IsReadOnly) fi2.IsReadOnly = false;
            fi2.Delete();  // 沒有權限(如系統(tǒng)盤需管理員權限)會產生異常,文件不存在不會產生異常
          }
        }

        foreach (DirectoryInfo di in source.GetDirectories())  // 復制目錄(實際上是創(chuàng)建同名目錄,和源目錄的屬性不同步)
        {
          Console.WriteLine(" {0} {1}", di.FullName, di.Name);  // Name不含路徑,僅本級目錄名
          Console.WriteLine(@"準備創(chuàng)建目錄 {0}\{1}", target.FullName, di.Name);
          DirectoryInfo newdi = new DirectoryInfo(Path.Combine(target.FullName, di.Name));
          if (!newdi.Exists)  // 如果CopyAllAsync放在if里的bug: 只要存在同名目錄,則不會進行子目錄和子文件的檢查和更新
          {
            Console.WriteLine("正在創(chuàng)建目錄 {0}", newdi.FullName);
            lblWork.Text = string.Format("正在復制目錄 {0}", newdi.FullName);
            DirectoryInfo diTargetSubDir = target.CreateSubdirectory(di.Name);  // 創(chuàng)建目錄
            Console.WriteLine("完成創(chuàng)建目錄 {0}", diTargetSubDir.FullName);
          }
          if (await CopyAllAsync(di, newdi) == false) return false; ;  // Copy each subdirectory using recursion
        }

        foreach (DirectoryInfo di2 in target.GetDirectories())  // 刪除源目錄沒有而目標目錄中有的目錄(及其子目錄和文件)
        {
          DirectoryInfo newdi2 = new DirectoryInfo(Path.Combine(source.FullName, di2.Name));
          if (!newdi2.Exists)
          {
            Console.WriteLine("正在刪除目錄 {0}", di2.FullName);
            lblWork.Text = string.Format("正在刪除目錄 {0}", di2.FullName);
            di2.Delete(true);  // 只讀的目錄和文件也能刪除,如不使用參數(shù)則異常"目錄不是空的"
          }
        }
        return true;
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
        MessageBox.Show(e.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return false;
      }
    }

分享名稱:使用C#實現(xiàn)一個差異文件備份工具-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/doidjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部