public static Patch Compare(IBackupSource source, IBackupChain target) { Trace.WriteLine("Comparing source to destination", "Patch"); var result = new Patch(source, target); var sourceFiles = source.EnumerateFiles ().ToArray (); result.RemovedFiles = target.GetFiles().Where(file => sourceFiles.All(a => a.RelativePath.ToLower() != file.ToLower())); result.AddedOrChangedFiles = sourceFiles.Where(a => !target.GetFiles().Select(m => m.ToLower()).Contains(a.RelativePath.ToLower()) || target.GetFileSize(a.RelativePath) != a.GetFileSize() || !HashMatches(target, a)).AsParallel ().ToArray (); return result; }
private static bool HashMatches(IBackupChain target, IBackupSourceFile a) { var sourceHash = a.GetFileHash(); var targetHash = target.GetFileHash(a.RelativePath); return sourceHash == targetHash; }
protected Patch(IBackupSource source, IBackupChain target) { Source = source; Target = target; }