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);
 }