欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于WPF實現(xiàn)簡單的文件夾比較工具

 更新時間:2023年05月24日 11:30:30   作者:wzwyc  
文件比較平常都是用Beyond?Compare,可以說離不開的神器,不過Beyond?Compare平常拿它主要是用來做代碼比較,用來做一些大批量的二進制文件比較,其實有點不是很方便,所以本文來用WPF做一個簡單的文件夾比較的小工具

文件比較平常都是用Beyond Compare,可以說離不開的神器,特別是針對代碼比較這塊,確實挺好用的。

不過Beyond Compare平常拿它主要是用來做代碼比較,用來做一些大批量的二進制文件比較,其實有點不是很方便。

于是造輪子,重新寫了一個簡單的文件夾比較的小工具。

平常主要是拿來做一些Nuget包的比對,應用包版本的比較。

文件夾比較邏輯,采用迭代比較的方式:

using CgdataBase;
using FolderCompare.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FolderCompare.Helpers
{
    public static class CompareHelper
    {
        public static void CompareDirectory(CgDirectoryInfo path1, CgDirectoryInfo path2)
        {
            if (path1.Children.IsNullOrEmpty())
            {
                if (path2.Children.IsNullOrEmpty())
                {
                    path1.Result = ECompareResult.匹配;
                    path2.Result = ECompareResult.匹配;
                }
                else
                {
                    path1.Result = ECompareResult.空;
                    path2.Result = ECompareResult.孤立;
                    SetCompareResult(path2, ECompareResult.匹配);
                }
                return;
            }
            if (path2.Children.IsNullOrEmpty())
            {
                path1.Result = ECompareResult.孤立;
                path2.Result = ECompareResult.空;
                SetCompareResult(path1, ECompareResult.匹配);
                return;
            }
            var dirList = new List<string>();
            var fileList = new List<string>();
            dirList.AddRange(path1.Children.Where(s => s.IsDirectory).Select(s => s.Name));
            dirList.AddRange(path2.Children.Where(s => s.IsDirectory).Select(s => s.Name));
            fileList.AddRange(path1.Children.Where(s => !s.IsDirectory).Select(s => s.Name));
            fileList.AddRange(path2.Children.Where(s => !s.IsDirectory).Select(s => s.Name));
            var index = 0;
            if (dirList.HadItems())
            {
                var items = dirList.Distinct().ToList();
                items.Sort();
                foreach (var item in items)
                {
                    var dir1 = path1.Children.OfType<CgDirectoryInfo>().SingleOrDefault(s => s.Name == item);
                    if (dir1 == null)
                    {
                        dir1 = new CgDirectoryInfo();
                        dir1.Result = ECompareResult.空;
                        path1.Children.Insert(index, dir1);
                        var dir2 = path2.Children.OfType<CgDirectoryInfo>().Single(s => s.Name == item);
                        dir2.Result = ECompareResult.孤立;
                        var old = path2.Children.IndexOf(dir2);
                        path2.Children.Move(old, index);
                        SetCompareResult(dir2, ECompareResult.匹配);
                    }
                    else
                    {
                        var dir2 = path2.Children.OfType<CgDirectoryInfo>().SingleOrDefault(s => s.Name == item);
                        if (dir2 == null)
                        {
                            dir2 = new CgDirectoryInfo();
                            dir2.Result = ECompareResult.空;
                            path2.Children.Insert(index, dir2);
                            dir1.Result = ECompareResult.孤立;
                            var old = path1.Children.IndexOf(dir1);
                            path1.Children.Move(old, index);
                            SetCompareResult(dir1, ECompareResult.匹配);
                        }
                        else
                        {
                            CompareDirectory(dir1, dir2);
                            var old = path1.Children.IndexOf(dir1);
                            path1.Children.Move(old, index);
                            old = path2.Children.IndexOf(dir2);
                            path2.Children.Move(old, index);
                        }
                        dir2.Index = index;
                    }
                    dir1.Index = index;
                    index++;
                }
            }
            if (fileList.HadItems())
            {
                var items = fileList.Distinct().ToList();
                items.Sort();
                foreach (var item in items)
                {
                    var file1 = path1.Children.OfType<CgFileInfo>().SingleOrDefault(s => s.Name == item);
                    if (file1 == null)
                    {
                        file1 = new CgFileInfo();
                        file1.Result = ECompareResult.空;
                        path1.Children.Insert(index, file1);
                        var file2 = path2.Children.OfType<CgFileInfo>().Single(s => s.Name == item);
                        file2.Result = ECompareResult.孤立;
                        var old = path2.Children.IndexOf(file2);
                        path2.Children.Move(old, index);
                    }
                    else
                    {
                        var file2 = path2.Children.OfType<CgFileInfo>().SingleOrDefault(s => s.Name == item);
                        if (file2 == null)
                        {
                            file2 = new CgFileInfo();
                            file2.Result = ECompareResult.空;
                            path2.Children.Insert(index, file2);
                            file1.Result = ECompareResult.孤立;
                            var old = path1.Children.IndexOf(file1);
                            path1.Children.Move(old, index);
                        }
                        else
                        {
                            CompareFile(file1, file2);
                            var old = path1.Children.IndexOf(file1);
                            path1.Children.Move(old, index);
                            old = path2.Children.IndexOf(file2);
                            path2.Children.Move(old, index);
                        }
                        file2.Index = index;
                    }
                    file1.Index = index;
                    index++;
                }
            }
            path1.Result = GetCompareResult(path1.Children);
            path2.Result = GetCompareResult(path2.Children);
        }
        private static void CompareFile(CgFileSystemInfo info1, CgFileSystemInfo info2)
        {
            if (info1.Name.IsNullOrEmpty())
            {
                info1.Result = ECompareResult.空;
                info2.Result = ECompareResult.孤立;
                return;
            }
            if (info2.Name.IsNullOrEmpty())
            {
                info1.Result = ECompareResult.孤立;
                info2.Result = ECompareResult.空;
                return;
            }
            if (info1.Length == info2.Length && info1.LastWriteTime == info2.LastWriteTime)
            {
                info1.Result = ECompareResult.匹配;
                info2.Result = ECompareResult.匹配;
            }
            else
            {
                if (info1.LastWriteTime > info2.LastWriteTime)
                {
                    info1.Result = ECompareResult.不匹配;
                    info2.Result = ECompareResult.較舊的;
                }
                else
                {
                    info1.Result = ECompareResult.較舊的;
                    info2.Result = ECompareResult.不匹配;
                }
            }
        }
        private static void SetCompareResult(CgDirectoryInfo info, ECompareResult result)
        {
            if (info.Children.HadItems())
            {
                foreach (var item in info.Children)
                {
                    if (item is CgDirectoryInfo dir)
                    {
                        dir.Result = result;
                        SetCompareResult(dir, result);
                    }
                    else if (item is CgFileInfo file)
                    {
                        file.Result = result;
                    }
                }
            }
        }
        public static ECompareResult GetCompareResult(ObservableCollection<CgFileSystemInfo> items)
        {
            if (items.IsNullOrEmpty())
                return ECompareResult.空;
            if (items.Any(s => s.Result == ECompareResult.不匹配 || s.Result == ECompareResult.較舊的))
                return ECompareResult.不匹配;
            if (items.Any(s => s.Result == ECompareResult.孤立))
                return ECompareResult.孤立;
            return ECompareResult.匹配;
        }
    }
}

源碼:https://gitee.com/wzwyc/FolderCompare

以上就是基于WPF實現(xiàn)簡單的文件夾比較工具的詳細內(nèi)容,更多關(guān)于WPF文件夾比較的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#特性 擴展方法

    C#特性 擴展方法

    在我們的編程生涯中我們要使用很多很多類庫,這些類庫有的是我們自己開發(fā)的,我們有她的代碼,有的是第三方發(fā)布的,我們不僅沒有他們的代碼,連看的機會都沒有
    2014-12-12
  • 用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法

    用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法

    用C#對ADO.NET數(shù)據(jù)庫完成簡單操作的方法...
    2007-03-03
  • C#爬蟲基礎(chǔ)之HttpClient獲取HTTP請求與響應

    C#爬蟲基礎(chǔ)之HttpClient獲取HTTP請求與響應

    這篇文章介紹了C#使用HttpClient獲取HTTP請求與響應的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#使用IronPython調(diào)用Python

    C#使用IronPython調(diào)用Python

    這篇文章主要給大家介紹了關(guān)于C#使用IronPython調(diào)用Python的相關(guān)資料, c#利用IronPython調(diào)用python的過程中總會遇到種種問題,這里給大家總結(jié)下,需要的朋友可以參考下
    2023-07-07
  • C#全角半角轉(zhuǎn)換函數(shù)代碼分享

    C#全角半角轉(zhuǎn)換函數(shù)代碼分享

    這篇文章介紹了C#全角半角轉(zhuǎn)換函數(shù)代碼,有需要的朋友可以參考一下
    2013-09-09
  • 利用WinForm實現(xiàn)上左右布局的方法詳解

    利用WinForm實現(xiàn)上左右布局的方法詳解

    現(xiàn)在90%的管理系統(tǒng)都是在用上左右這種布局方式,真可謂是經(jīng)典永流傳。本文將利用WinForm實現(xiàn)上左右布局這一布局效果,感興趣的可以學習一下
    2022-09-09
  • C#預處理指令之#line,#pragma warning 詳細解析

    C#預處理指令之#line,#pragma warning 詳細解析

    #line 指令可能由生成過程中的自動中間步驟使用。例如,如果行從原始的源代碼文件中移除,但是您仍希望編譯器基于文件中的原始行號生成輸出,則可以移除行,然后用 #line 模擬原始行號
    2014-01-01
  • C#比較兩個List集合內(nèi)容是否相同的幾種方法

    C#比較兩個List集合內(nèi)容是否相同的幾種方法

    本文詳細介紹了在C#中比較兩個List集合內(nèi)容是否相同的方法,包括非自定義類和自定義類的元素比較,對于非自定義類,可以使用SequenceEqual、排序后比較或HashSet來忽略重復元素,對于自定義類,需要重寫Equals和GetHashCode方法,然后使用相應的比較方法
    2025-02-02
  • C#中Socket通信編程的異步實現(xiàn)流程分析

    C#中Socket通信編程的異步實現(xiàn)流程分析

    Socket編程的異步實現(xiàn)是指按照異步過程來實現(xiàn)Socket編程,即在完成了一次調(diào)用后通過狀態(tài)、通知和回調(diào)來告知調(diào)用者,本文給大家介紹C#中Socket通信編程的異步實現(xiàn)流程分析,感興趣的朋友一起看看吧
    2024-12-12

最新評論