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

需要注意有如下几点:
- 文件只是比较大小,并没有对内容进行比较;
- 比较后放置差异的目录是根据当前时间生成的,每次运行目录不同;
- 工具不是很完善,没有处理文件被删除掉的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 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 这种来进行维护。