private bool FileHasChanged(FileSystemObject newFile, out int existingVersion) { existingVersion = -1; var oldFile = FindPath(_oldObjects, newFile.MappedPath); if (oldFile == null) { newFile.ComputeHash(HashAlgorithm); return true; } var crit = GetChangeCriterium(newFile); bool ret; switch (crit) { case ChangeCriterium.ArchiveFlag: ret = newFile.ArchiveFlag; break; case ChangeCriterium.Size: ret = newFile.Size != oldFile.Size; break; case ChangeCriterium.Date: ret = newFile.ModificationTime != oldFile.ModificationTime; break; case ChangeCriterium.Hash: ret = CompareHashes(newFile, oldFile); break; case ChangeCriterium.Custom: ret = FileHasChanged(newFile, oldFile); break; default: throw new ArgumentOutOfRangeException(); } if (!ret) { oldFile.Hashes.ForEach(x => newFile.Hashes[x.Key] = x.Value); newFile.LatestVersion = oldFile.LatestVersion; existingVersion = oldFile.LatestVersion; } return ret; }
private bool CompareHashes(FileSystemObject newFile, FileSystemObject oldFile) { if (oldFile.Hashes.Count == 0) return true; var kv = oldFile.Hashes.First(); var newHash = newFile.ComputeHash(kv.Key); return !newHash.SequenceEqual(kv.Value); }