起因:每次维护网站都需要进行全站备份,目前使用压缩后下载全部文件的方法。但是这样每次都要下载很大的文件,费时费力。因此需要一种方法能够让我只下载有差异的部分。为此编写了一个目录比较并且提取差异的工具,例如:我基于 edk2202308 修改出来了 edk2202308modified ,然后用工具进行比较,比较后的差别会自动提取到 100916 目录下。
需要注意有如下几点:
- 文件只是比较大小,并没有对内容进行比较;
- 比较后放置差异的目录是根据当前时间生成的,每次运行目录不同;
- 工具不是很完善,没有处理文件被删除掉的情况
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 这种来进行维护。