internal void RunSortFilesAction() { _results = new FileComparisonResult[] { }; switch (_action) { case SortFilesAction.SearchDifferences: _results = SortFilesSearchDifferences.Go(_settings).ToArray(); break; case SortFilesAction.SearchDuplicates: _results = SortFilesSearchDuplicates.Go(_settings).ToArray(); break; case SortFilesAction.SearchDuplicatesInOneDir: _results = SortFilesSearchDuplicatesInOneDir.Go(_settings).ToArray(); break; default: Utils.MessageErr("Unrecognized action."); break; } // update UI on main thread WrapInvoke(() => { listView_ColumnClick(null, new ColumnClickEventArgs(0)); listView.Columns[1].Width = -2; // autosize to the longest item in the column lblAction.Text = _caption + Utils.NL; lblAction.Text += "" + _results.Length + " file(s) listed:"; }); }
static void TestMethod_TestSortFilesOperations() { // run the methods on actual files. first create combinations of modified/not modified. var settings = new SortFilesSettings(); settings.LeftDirectory = TestUtil.GetTestSubDirectory("left_fndmved", true); settings.RightDirectory = TestUtil.GetTestSubDirectory("right_fndmved", true); var filesCreated = CreateFileCombinations.Go( settings.LeftDirectory, settings.RightDirectory); TestUtil.IsEq( CreateFileCombinations.CountPossibleModifiedTimes() * CreateFileCombinations.CountPossibleContents() * CreateFileCombinations.CountPossibleFilenames() * ((1 * 2) + (3 * 2)), // ExtraCopies.None -> 2 files, the rest -> 3 files filesCreated); // search for duplicates in one dir, only ones it will find are 'extra copy on left.' var results = SortFilesSearchDuplicatesInOneDir.Go(settings); TestUtil.IsEq( CreateFileCombinations.CountPossibleModifiedTimes() * CreateFileCombinations.CountPossibleContents() * CreateFileCombinations.CountPossibleFilenames(), results.Count); // verify sort order. for each pair, the left side should sort first alphabetically var expectedDuplicates = @"MTimeAddTextMNameOneOnLeft.a|MTimeAddTextMNameOneOnLeft.a_1|Same_Contents MTimeAddTextSmNameOneOnLeft.a|MTimeAddTextSmNameOneOnLeft.a_1|Same_Contents MTimeAltTextMNameOneOnLeft.a|MTimeAltTextMNameOneOnLeft.a_1|Same_Contents MTimeAltTextSmNameOneOnLeft.a|MTimeAltTextSmNameOneOnLeft.a_1|Same_Contents MTimeSmTextMNameOneOnLeft.a|MTimeSmTextMNameOneOnLeft.a_1|Same_Contents MTimeSmTextSmNameOneOnLeft.a|MTimeSmTextSmNameOneOnLeft.a_1|Same_Contents SmTimeAddTextMNameOneOnLeft.a|SmTimeAddTextMNameOneOnLeft.a_1|Same_Contents SmTimeAddTextSmNameOneOnLeft.a|SmTimeAddTextSmNameOneOnLeft.a_1|Same_Contents SmTimeAltTextMNameOneOnLeft.a|SmTimeAltTextMNameOneOnLeft.a_1|Same_Contents SmTimeAltTextSmNameOneOnLeft.a|SmTimeAltTextSmNameOneOnLeft.a_1|Same_Contents SmTimeSmTextMNameOneOnLeft.a|SmTimeSmTextMNameOneOnLeft.a_1|Same_Contents SmTimeSmTextSmNameOneOnLeft.a|SmTimeSmTextSmNameOneOnLeft.a_1|Same_Contents"; CompareResultsToString(results, expectedDuplicates); // search for duplicates across directories // should find all files on the right marked 'SmText'. results = SortFilesSearchDuplicates.Go(settings); var countExpectedDuplicates = (from filename in Directory.EnumerateFiles(settings.RightDirectory) where filename.Contains("SmText") select filename).Count(); TestUtil.IsEq(countExpectedDuplicates, results.Count); // verify sort order expectedDuplicates = @"MTimeSmTextMNameNone.a|MTimeSmTextMNameNone.z|Same_Contents MTimeSmTextMNameOneOnLeft.a|MTimeSmTextMNameOneOnLeft.z|Same_Contents MTimeSmTextMNameOneOnRight.a|MTimeSmTextMNameOneOnRight.z|Same_Contents MTimeSmTextMNameOneOnRight.a|MTimeSmTextMNameOneOnRight.z_1|Same_Contents MTimeSmTextSmNameNone.a|MTimeSmTextSmNameNone.a|Same_Contents MTimeSmTextSmNameOneOnLeft.a|MTimeSmTextSmNameOneOnLeft.a|Same_Contents MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a|Same_Contents MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a_1|Same_Contents SmTimeSmTextMNameNone.a|SmTimeSmTextMNameNone.z|Same_Contents SmTimeSmTextMNameOneOnLeft.a|SmTimeSmTextMNameOneOnLeft.z|Same_Contents SmTimeSmTextMNameOneOnRight.a|SmTimeSmTextMNameOneOnRight.z|Same_Contents SmTimeSmTextMNameOneOnRight.a|SmTimeSmTextMNameOneOnRight.z_1|Same_Contents SmTimeSmTextSmNameNone.a|SmTimeSmTextSmNameNone.a|Same_Contents SmTimeSmTextSmNameOneOnLeft.a|SmTimeSmTextSmNameOneOnLeft.a|Same_Contents SmTimeSmTextSmNameOneOnRight.a|SmTimeSmTextSmNameOneOnRight.a|Same_Contents SmTimeSmTextSmNameOneOnRight.a|SmTimeSmTextSmNameOneOnRight.a_1|Same_Contents"; CompareResultsToString(results, expectedDuplicates); // search for duplicates across directories, but uses lmt as a shortcut (less thorough) // it will now think that the SmTimeAltText ones are equal because, // when it sees the lmt are the same, it treats them as the same and doesn't check hash settings.SearchDuplicatesCanUseFiletimes = true; results = SortFilesSearchDuplicates.Go(settings); settings.SearchDuplicatesCanUseFiletimes = false; expectedDuplicates = @"MTimeSmTextMNameNone.a|MTimeSmTextMNameNone.z|Same_Contents MTimeSmTextMNameOneOnLeft.a|MTimeSmTextMNameOneOnLeft.z|Same_Contents MTimeSmTextMNameOneOnRight.a|MTimeSmTextMNameOneOnRight.z|Same_Contents MTimeSmTextMNameOneOnRight.a|MTimeSmTextMNameOneOnRight.z_1|Same_Contents MTimeSmTextSmNameNone.a|MTimeSmTextSmNameNone.a|Same_Contents MTimeSmTextSmNameOneOnLeft.a|MTimeSmTextSmNameOneOnLeft.a|Same_Contents MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a|Same_Contents MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a_1|Same_Contents SmTimeAltTextSmNameNone.a|SmTimeAltTextSmNameNone.a|Same_Contents SmTimeAltTextSmNameOneOnLeft.a|SmTimeAltTextSmNameOneOnLeft.a|Same_Contents SmTimeAltTextSmNameOneOnRight.a|SmTimeAltTextSmNameOneOnRight.a|Same_Contents SmTimeSmTextMNameNone.a|SmTimeSmTextMNameNone.z|Same_Contents SmTimeSmTextMNameOneOnLeft.a|SmTimeSmTextMNameOneOnLeft.z|Same_Contents SmTimeSmTextMNameOneOnRight.a|SmTimeSmTextMNameOneOnRight.z|Same_Contents SmTimeSmTextMNameOneOnRight.a|SmTimeSmTextMNameOneOnRight.z_1|Same_Contents SmTimeSmTextSmNameNone.a|SmTimeSmTextSmNameNone.a|Same_Contents SmTimeSmTextSmNameOneOnLeft.a|SmTimeSmTextSmNameOneOnLeft.a|Same_Contents SmTimeSmTextSmNameOneOnRight.a|SmTimeSmTextSmNameOneOnRight.a|Same_Contents SmTimeSmTextSmNameOneOnRight.a|SmTimeSmTextSmNameOneOnRight.a_1|Same_Contents"; CompareResultsToString(results, expectedDuplicates); // search for differences in similar directories. results = SortFilesSearchDifferences.Go(settings); var expectedDifferences = @"|MTimeAddTextMNameNone.z|Right |MTimeAddTextMNameOneOnLeft.z|Right |MTimeAddTextMNameOneOnRight.z|Right |MTimeAddTextMNameOneOnRight.z_1|Right |MTimeAddTextSmNameOneOnRight.a_1|Right |MTimeAltTextMNameNone.z|Right |MTimeAltTextMNameOneOnLeft.z|Right |MTimeAltTextMNameOneOnRight.z|Right |MTimeAltTextMNameOneOnRight.z_1|Right |MTimeAltTextSmNameOneOnRight.a_1|Right |MTimeSmTextMNameNone.z|Right |MTimeSmTextMNameOneOnLeft.z|Right |MTimeSmTextMNameOneOnRight.z|Right |MTimeSmTextMNameOneOnRight.z_1|Right |MTimeSmTextSmNameOneOnRight.a_1|Right |SmTimeAddTextMNameNone.z|Right |SmTimeAddTextMNameOneOnLeft.z|Right |SmTimeAddTextMNameOneOnRight.z|Right |SmTimeAddTextMNameOneOnRight.z_1|Right |SmTimeAddTextSmNameOneOnRight.a_1|Right |SmTimeAltTextMNameNone.z|Right |SmTimeAltTextMNameOneOnLeft.z|Right |SmTimeAltTextMNameOneOnRight.z|Right |SmTimeAltTextMNameOneOnRight.z_1|Right |SmTimeAltTextSmNameOneOnRight.a_1|Right |SmTimeSmTextMNameNone.z|Right |SmTimeSmTextMNameOneOnLeft.z|Right |SmTimeSmTextMNameOneOnRight.z|Right |SmTimeSmTextMNameOneOnRight.z_1|Right |SmTimeSmTextSmNameOneOnRight.a_1|Right MTimeAddTextMNameNone.a||Left MTimeAddTextMNameOneOnLeft.a||Left MTimeAddTextMNameOneOnLeft.a_1||Left MTimeAddTextMNameOneOnRight.a||Left MTimeAddTextSmNameNone.a|MTimeAddTextSmNameNone.a|Changed MTimeAddTextSmNameOneOnLeft.a|MTimeAddTextSmNameOneOnLeft.a|Changed MTimeAddTextSmNameOneOnLeft.a_1||Left MTimeAddTextSmNameOneOnRight.a|MTimeAddTextSmNameOneOnRight.a|Changed MTimeAltTextMNameNone.a||Left MTimeAltTextMNameOneOnLeft.a||Left MTimeAltTextMNameOneOnLeft.a_1||Left MTimeAltTextMNameOneOnRight.a||Left MTimeAltTextSmNameNone.a|MTimeAltTextSmNameNone.a|Changed MTimeAltTextSmNameOneOnLeft.a|MTimeAltTextSmNameOneOnLeft.a|Changed MTimeAltTextSmNameOneOnLeft.a_1||Left MTimeAltTextSmNameOneOnRight.a|MTimeAltTextSmNameOneOnRight.a|Changed MTimeSmTextMNameNone.a||Left MTimeSmTextMNameOneOnLeft.a||Left MTimeSmTextMNameOneOnLeft.a_1||Left MTimeSmTextMNameOneOnRight.a||Left MTimeSmTextSmNameNone.a|MTimeSmTextSmNameNone.a|Changed MTimeSmTextSmNameOneOnLeft.a|MTimeSmTextSmNameOneOnLeft.a|Changed MTimeSmTextSmNameOneOnLeft.a_1||Left MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a|Changed SmTimeAddTextMNameNone.a||Left SmTimeAddTextMNameOneOnLeft.a||Left SmTimeAddTextMNameOneOnLeft.a_1||Left SmTimeAddTextMNameOneOnRight.a||Left SmTimeAddTextSmNameNone.a|SmTimeAddTextSmNameNone.a|Changed SmTimeAddTextSmNameOneOnLeft.a|SmTimeAddTextSmNameOneOnLeft.a|Changed SmTimeAddTextSmNameOneOnLeft.a_1||Left SmTimeAddTextSmNameOneOnRight.a|SmTimeAddTextSmNameOneOnRight.a|Changed SmTimeAltTextMNameNone.a||Left SmTimeAltTextMNameOneOnLeft.a||Left SmTimeAltTextMNameOneOnLeft.a_1||Left SmTimeAltTextMNameOneOnRight.a||Left SmTimeAltTextSmNameOneOnLeft.a_1||Left SmTimeSmTextMNameNone.a||Left SmTimeSmTextMNameOneOnLeft.a||Left SmTimeSmTextMNameOneOnLeft.a_1||Left SmTimeSmTextMNameOneOnRight.a||Left SmTimeSmTextSmNameOneOnLeft.a_1||Left"; CompareResultsToString(results, expectedDifferences); // account for all 96 files. // (SortFilesSearchDifferences doesn't check hashes, so although it knows // AddText are different because filesize changes, // it won't detect AltText unless filesize or lmt are also different.) var expectedSame = @"SmTimeAltTextSmNameNone.a|SmTimeAltTextSmNameNone.a SmTimeAltTextSmNameOneOnLeft.a|SmTimeAltTextSmNameOneOnLeft.a SmTimeAltTextSmNameOneOnRight.a|SmTimeAltTextSmNameOneOnRight.a SmTimeSmTextSmNameNone.a|SmTimeSmTextSmNameNone.a SmTimeSmTextSmNameOneOnLeft.a|SmTimeSmTextSmNameOneOnLeft.a SmTimeSmTextSmNameOneOnRight.a|SmTimeSmTextSmNameOneOnRight.a"; TestUtil.IsEq(filesCreated, CountFilenames(expectedDifferences) + CountFilenames(expectedSame)); // search for identical files with different write times // will find all with MTimeSmText var found = SortFilesSearchDuplicates.SearchForIdenticalFilesWithDifferentWriteTimes( settings.LeftDirectory, settings.RightDirectory, results); var expectedIdenticalContents = @"MTimeSmTextSmNameNone.a|MTimeSmTextSmNameNone.a|Changed MTimeSmTextSmNameOneOnLeft.a|MTimeSmTextSmNameOneOnLeft.a|Changed MTimeSmTextSmNameOneOnRight.a|MTimeSmTextSmNameOneOnRight.a|Changed"; CompareResultsToString(found, expectedIdenticalContents); }