基于WPF实现简单的文件夹比较工具
作者:wzwyc 时间:2023-11-15 16:08:34
文件比较平常都是用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
来源:https://www.cnblogs.com/wzwyc/p/17427322.html
标签:WPF,文件夹,比较
0
投稿
猜你喜欢
用C#生成不重复的随机数的代码
2023-03-08 03:36:52
用Rational Rose逆向工程(java)生成类图(教程和错误解决)
2023-05-20 20:34:14
java实现合并单元格的同时并导出excel示例
2022-05-15 04:22:38
Android Studio中生成aar文件及本地方式使用aar文件的方法
2022-06-14 23:43:59
idea 与 maven 使用过程中遇到的问题及解决方案
2021-10-07 02:34:24
SpringBoot通知机制的实现方式
2022-06-25 04:01:54
使用PageHelper插件实现Service层分页
2023-03-06 00:40:39
SpringBoot整合OpenCV的实现示例
2022-09-07 03:53:19
Android项目实战之仿网易顶部导航栏效果
2022-07-14 10:20:51
android实现QQ微信侧滑删除效果
2021-07-11 15:58:11
从字符串中截取等长字节的Java代码
2023-03-12 10:11:41
C# 批处理调用方法
2021-06-18 17:14:19
Android中Retrofit 2.0直接使用JSON进行数据交互
2022-01-08 07:22:46
java基础之NIO介绍及使用
2022-06-07 11:30:14
Android热修复及插件化原理示例详解
2023-03-07 01:37:52
unity实现贪吃蛇游戏
2022-05-28 07:07:51
Java数字格式类(NumberFormat类和DecimalFormat类)用法详解
2022-11-14 14:54:02
Android利用CountDownTimer实现点击获取验证码倒计时效果
2023-09-09 21:09:54
Android中通过view方式获取当前Activity的屏幕截图实现方法
2021-09-20 09:17:22
C# Dictionary的使用实例代码
2021-07-29 14:02:02