基于WPF实现简单的文件夹比较工具

 更新时间: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实现简单的文件夹比较工具的详细内容,更多关于WPF文件夹比较的资料请关注脚本之家其它相关文章!

相关文章

  • 详解C#中HashTable的用法

    详解C#中HashTable的用法

    在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值
    2016-02-02
  • Unity时间戳的使用方法

    Unity时间戳的使用方法

    这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C# textBox如何实时更新到最新行

    C# textBox如何实时更新到最新行

    这篇文章主要介绍了C# textBox如何实时更新到最新行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍

    一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能
    2013-10-10
  • C#使用Objects Comparer进行对象比较

    C#使用Objects Comparer进行对象比较

    本文主要介绍了C#使用Objects Comparer进行对象比较,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C#中的队列Queue<T>与堆栈Stack<T>

    C#中的队列Queue<T>与堆栈Stack<T>

    这篇文章介绍了C#中的队列Queue<T>与堆栈Stack<T>,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#实现简单记事本程序

    C#实现简单记事本程序

    这篇文章主要为大家详细介绍了C#实现简单记事本程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#/VB.NET实现在Word文档中添加页眉和页脚

    C#/VB.NET实现在Word文档中添加页眉和页脚

    页眉位于文档中每个页面的顶部区域,常用于显示文档的附加信息;页脚位于文档中每个页面的底部的区域,常用于显示文档的附加信息。今天这篇文章就将为大家展示如何以编程的方式在在 Word 文档中添加页眉和页脚
    2023-03-03
  • C#标识符的使用小结

    C#标识符的使用小结

    C#标识符还是比较常见的东西,这里我们主要介绍C#标识符中的用法,包括介绍 static 的方法和bool 的形参等方面
    2014-01-01
  • C#类中static变量用法分析

    C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下
    2015-01-01

最新评论