目录比较差异提取工具

起因:每次维护网站都需要进行全站备份,目前使用压缩后下载全部文件的方法。但是这样每次都要下载很大的文件,费时费力。因此需要一种方法能够让我只下载有差异的部分。为此编写了一个目录比较并且提取差异的工具,例如:我基于 edk2202308 修改出来了 edk2202308modified ,然后用工具进行比较,比较后的差别会自动提取到 100916 目录下。

需要注意有如下几点:

  1. 文件只是比较大小,并没有对内容进行比较;
  2. 比较后放置差异的目录是根据当前时间生成的,每次运行目录不同;
  3. 工具不是很完善,没有处理文件被删除掉的情况
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ComparePatch
{
    class Program
    {
        static void Printusage()
        {
            Console.WriteLine("Directory compare and patch utility");
            Console.WriteLine("Usage:");
            Console.WriteLine("cap Latest LastBackup PatchDir");
            Console.WriteLine("");
        }

        static void CopyFileTo(String Filename, String TargetDir)
        {

        }

        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Printusage();
                Environment.Exit(0);
            }
            // 指定要枚举的目录
            string Latest, LastBackup, PatchDir;
            Latest = args[0];
            LastBackup = args[1];
            if (Latest[Latest.Length - 1] != '\\')
            {
                Latest = Latest + '\\';
            }
            if (LastBackup[LastBackup.Length - 1] != '\\')
            {
                LastBackup = LastBackup + '\\';
            }
            PatchDir = Directory.GetCurrentDirectory() + "\\" + DateTime.Now.ToString("HHmmss") + "\\";
            Console.WriteLine("Compare " + LastBackup + " with " + Latest);
            Console.WriteLine("And put files into " + PatchDir);

            try
            {
                // 使用Directory类的GetFiles方法获取所有文件,包括所有子目录
                string[] filesInLastBackup = Directory.GetFiles(LastBackup, "*", SearchOption.AllDirectories);
                Console.WriteLine("Files in " + LastBackup + " and all subdirectories:");

                // 遍历所有文件并打印
                foreach (string file in filesInLastBackup)
                {
                    // 情况1
                    if (File.Exists(file.Replace(LastBackup, Latest)))
                    {
                        // 新目录下存在该文件
                        // 创建一个FileInfo对象
                        FileInfo NewFileInfo = new FileInfo(file);
                        FileInfo OldFileInfo = new FileInfo(file.Replace(LastBackup, Latest));
                        String PatchFileName = file.Replace(LastBackup, PatchDir);
                        if (NewFileInfo.Length != OldFileInfo.Length)
                        {
                            // 文件大小不同,判定为不同
                            Console.WriteLine("=========================");
                            Console.Write("New file would be copy to");
                            Console.WriteLine(PatchFileName);
                            if (!Directory.Exists(Path.GetDirectoryName(PatchFileName))) {
                                Directory.CreateDirectory(Path.GetDirectoryName(PatchFileName));
                            }
                            File.Copy(file, PatchFileName); 
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("The process failed: {0}", e.ToString());
            }

            // Console.ReadKey();
        }
    }
}

可执行文件:

如果你有更专业的需求,可以考虑直接使用 GIT 这种来进行维护。