最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#寫差異文件備份工具的示例

 更新時(shí)間:2020年10月26日 11:30:15   作者:黑衫老腰  
這篇文章主要介紹了C#寫差異文件備份工具的示例,幫助大家利用c#備份,管理文件,感興趣的朋友可以了解下

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

關(guā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)錯(cuò)誤!";
      btnBackUp.Enabled = true;
      txtSource.Enabled = true;
      txtTarget.Enabled = true;
      btnBackUp.Focus();
    }

    public async Task<bool> CopyAllAsync(DirectoryInfo source, DirectoryInfo target)
    {
      try
      {
        foreach (FileInfo fi in source.GetFiles())  // 復(fù)制最新文件
        {
          Console.WriteLine(@"準(zhǔn)備復(fù)制文件 {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("正在復(fù)制文件 {0}", newfi.FullName);
            lblWork.Text = string.Format("正在復(fù)制文件 {0}", newfi.FullName);
            if (newfi.Exists && newfi.IsReadOnly) newfi.IsReadOnly = false;
            // 覆蓋或刪除只讀文件會(huì)產(chǎn)生異常:對(duì)路徑“XXX”的訪問被拒絕
            fi.CopyTo(newfi.FullName, true);  // Copy each file into it's new directory
          }
        }

        foreach (FileInfo fi2 in target.GetFiles())  // 刪除源目錄沒有而目標(biāo)目錄中有的文件
        {
          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();  // 沒有權(quán)限(如系統(tǒng)盤需管理員權(quán)限)會(huì)產(chǎn)生異常,文件不存在不會(huì)產(chǎn)生異常
          }
        }

        foreach (DirectoryInfo di in source.GetDirectories())  // 復(fù)制目錄(實(shí)際上是創(chuàng)建同名目錄,和源目錄的屬性不同步)
        {
          Console.WriteLine(" {0} {1}", di.FullName, di.Name);  // Name不含路徑,僅本級(jí)目錄名
          Console.WriteLine(@"準(zhǔn)備創(chuàng)建目錄 {0}\{1}", target.FullName, di.Name);
          DirectoryInfo newdi = new DirectoryInfo(Path.Combine(target.FullName, di.Name));
          if (!newdi.Exists)  // 如果CopyAllAsync放在if里的bug: 只要存在同名目錄,則不會(huì)進(jìn)行子目錄和子文件的檢查和更新
          {
            Console.WriteLine("正在創(chuàng)建目錄 {0}", newdi.FullName);
            lblWork.Text = string.Format("正在復(fù)制目錄 {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())  // 刪除源目錄沒有而目標(biāo)目錄中有的目錄(及其子目錄和文件)
        {
          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;
      }
    }

 注意事項(xiàng):

// 文件和目錄的創(chuàng)建日期為首次全新復(fù)制時(shí)的創(chuàng)建時(shí)間
// 文件復(fù)制后修改日期始終保持原先的不變,目錄的修改日期為首次全新復(fù)制時(shí)的創(chuàng)建時(shí)間(因?yàn)楸揪褪切陆?
// 單純的覆蓋不會(huì)改變修改時(shí)間和創(chuàng)建時(shí)間
// 文件發(fā)生的屬性變化全新復(fù)制時(shí)可以保留(無法通過更新時(shí)間判斷文件的屬性變化)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

今天測試,又發(fā)現(xiàn)一個(gè)bug,真是防不勝防,好在終于找到病根并解決了。

問題出在 if (await CopyAllAsync(diSource, diTarget)) 這個(gè)地方,備份開始后,lblWork.Text = "備份開始!";  結(jié)果發(fā)現(xiàn)標(biāo)簽的設(shè)置并不生效,然后界面很卡,不能拖動(dòng)窗口。在需要備份更新的文件特別多時(shí)感覺更明顯。

原來,設(shè)置控件的Enabled屬性是立即生效,但控件的Text屬性并不是立即生效,就是UI界面不會(huì)立即更新,只是將設(shè)置信息加入了windows消息隊(duì)列,通常等所在的方法執(zhí)行完畢后才生效,但如果方法中該語句后面還有同類的設(shè)置,就會(huì)感覺不到它的生效,其實(shí)是生效了,只是先設(shè)為了一個(gè)值,然后又立即設(shè)為了另一個(gè)值,因?yàn)樘炝耍搜劭床怀鰜?。同樣的原因,“正在?fù)制文件XXX”也不即時(shí)顯示正在復(fù)制的文件信息。

然后,界面卡頓,是因?yàn)榭截惖臅r(shí)候執(zhí)行緊密運(yùn)算,但是CopyAllAsync(diSource, diTarget)方法并沒有在單獨(dú)的線程運(yùn)行,占用了UI線程,導(dǎo)致界面卡頓,改成下面這樣,完美解決:

lblWork.Text = "備份開始!"; bool result = await Task.Run(() => CopyAllAsync(diSource, diTarget));   // 這兒是關(guān)鍵
if (result)  // if (await CopyAllAsync(diSource, diTarget)) 開始后界面會(huì)卡{
  lblWork.Text = "備份完成!";
  MessageBox.Show("備份完畢!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else lblWork.Text = "出現(xiàn)錯(cuò)誤!";

以上就是C#寫差異文件備份工具的示例的詳細(xì)內(nèi)容,更多關(guān)于c# 文件備份的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

射洪县| 江山市| 洛扎县| 堆龙德庆县| 新巴尔虎左旗| 香格里拉县| 金塔县| 武义县| 邓州市| 界首市| 宾阳县| 鄂温| 红原县| 富宁县| 斗六市| 蓝田县| 辉县市| 本溪| 墨玉县| 普陀区| 容城县| 永川市| 舟山市| 曲阳县| 呼和浩特市| 高台县| 宣恩县| 石屏县| 丽水市| 阿拉善左旗| 图片| 堆龙德庆县| 洛宁县| 泉州市| 山东省| 青海省| 荆州市| 黄冈市| 张家界市| 贵州省| 神木县|