文件夹比较工具

这篇具有很好参考价值的文章主要介绍了文件夹比较工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文件比较平常都是用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://www.toymoban.com/news/detail-457136.html

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

 

到了这里,关于文件夹比较工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

    本机环境:win11家庭中文版 一、官网下载  二、安装              三、查看nodejs及npm版本号 1、查看node版本号 2、查看NPM版本号(安装nodejs时已自动安装npm)  四、配置npm全局下载工具包和缓存目录 1、查看安装目录  在本目录下创建node_global和node_cache目录,以后通过npm安装

    2024年02月14日
    浏览(51)
  • Linux移动文件夹(文件)到其他文件夹 / 复制到其他文件夹 【cp / mv命令】

    1)将一个文件夹复制到另一个文件夹下(一般复制一个项目的时候,直接使用这个命令) cp -r /home/packageA /home/packageB 运行命令之后packageB文件夹下就有packageA文件夹了。  2)将一个文件夹下的所有内容复制到另一个文件夹下(这种一般是复制很多小文件的时候使用) cp -r /

    2024年02月06日
    浏览(75)
  • Java文件处理(一):创建文件、遍历文件夹、删除文件/文件夹

    本篇以代码为核心,在实践中自学吧年轻人~ 要进行文件处理肯定需要 File 类啦。 File 的实例是一个实例(?),但是可以链接到本地的文件、文件夹,并对它们进行操作。 从下面的一些示例中可以看到,同一份本地文件可以拥有多个File对象;同时,构造一个File对象时传入

    2024年02月05日
    浏览(78)
  • Python-拷贝文件和文件夹到指定的文件夹

    之前使用windows批处理命令,感觉语法太不友好,还需要传很多参数,用起来很麻烦,最后还是用Python来实现。 网上太多的教程,真的不知所云,有点太麻烦了,拷贝之前先删除,也懒得判断。 shutil.copyfile 顾名思义 拷贝的是文件 shutil.copytree 顾名思义 拷贝的是文件夹 这样使

    2024年02月11日
    浏览(91)
  • python判断文件或文件夹是否存在、创建文件夹

    以下的内容参考http://t.csdn.cn/aybFd,https://www.cnblogs.com/hushaojun/p/4533241.html python判断文件或文件夹是否存在、创建文件夹 1、判断文件或文件夹是否存在 2、判断所给路径是文件还是文件夹 3、创建文件夹 4、获取当前.py文件的路径 5、获取指定目录下所有的文件和文件夹 删除一个

    2024年02月10日
    浏览(75)
  • python读取文件夹下的文件以及子文件夹中文件

    os.listdir() 读取目标文件夹下的文件名和子文件夹名,不会递归读取子文件夹下 方法一: root, dirs, files = os.walk() 递归读取文件夹和 子文件夹下所有文件 。方法二:也可以用os.listdir(),判断是文件夹再os.listdir()自己写一个递归程序 示例

    2024年02月16日
    浏览(70)
  • 【用python将文件夹下面的文件夹里面的文件全部提取出来,并且放到一个新的文件夹】

    可以使用Python的os和shutil库来完成这个任务。 比如说:我的faces95文件夹下面有95个文件,每个文件下面有十七到十八个照片不等。 把所有照片提取出来可以用以下python代码: 需要修改的地方: data_folder = \\\' \\\'中的 改为自己的需要提取的文件路径 photo_folder = \\\' \\\'中的 改为自己的

    2023年04月17日
    浏览(46)
  • SHELL脚本 遍历文件夹下所有文件以及子文件夹

    dir 要设置为局部变量 如果设置为全局变量 在func递归时传入的参数 会改变 dir的值,将导致之后的文件目录错误(为更改后的dir值) 当前目录情况: 执行完shell后: 附上代码: 如有不对,感谢指出。

    2024年02月12日
    浏览(56)
  • 【java】删除文件夹及文件夹中的所有文件

    删除指定文件夹及文件夹中的所有文件。 JDK 1.8 在JDK 8中,可以使用java.nio.file.Files和java.nio.file.Path类来删除一个文件夹及其中的所有文件和子文件夹。具体代码如下所示: 在上述代码中,请将 your-directory-path 替换为要删除的目录路径。程序首先检查指定路径是否是一个目录,

    2024年02月11日
    浏览(105)
  • 【正点原子STM32】SYSTEM文件夹介绍(sys文件夹、deley文件夹、USART 文件夹、SysTick、printf函数、fputc函数、半主机模式)

    一、sys文件夹介绍 二、deley文件夹介绍 2.1、deley文件夹函数简介 2.2、SysTick工作原理 2.3、SysTick寄存器介绍 2.4、delay_init()函数 2.5、delay_us()函数 2.6、delay_ms()函数 三、USART 文件夹介绍 3.1、printf函数输出流程 3.2、printf的使用 3.3、printf函数支持 半主机模式简介 方法一:微库法

    2024年03月11日
    浏览(94)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包