public static ICollection <ApplicationUninstallerEntry> GetApplicationsFromDirectories( IEnumerable <ApplicationUninstallerEntry> allUninstallers, ICollection <DirectoryInfo> results) { var output = new List <ApplicationUninstallerEntry>(); var processed = new List <DirectoryInfo>(); foreach (var dir in results.Distinct(PathTools.PathsEqual).OrderBy(x => x.FullName)) { if (processed.Any(x => x.FullName.Contains(dir.FullName, StringComparison.InvariantCultureIgnoreCase))) { continue; } processed.Add(dir); } var exceptions = allUninstallers.Where(x => x.InstallLocation != null).ToList(); var infoAdder = new InfoAdderManager(); foreach (var dir in processed) { var items = exceptions.Where( x => x.InstallLocation.Contains(dir.FullName, StringComparison.InvariantCultureIgnoreCase)) .ToList(); if (items.Count > 0) { output.AddRange(items); continue; } var res = DirectoryFactory.TryCreateFromDirectory(dir, exceptions).ToList(); if (res.Count == 0) { MessageBox.Show( string.Format(Localisable.Uninstaller_GetApplicationsFromDirectories_NothingFound_Message, dir.FullName), Localisable.Uninstaller_GetApplicationsFromDirectories_NothingFound_Title, MessageBoxButtons.OK, MessageBoxIcon.Warning); continue; } foreach (var result in res) { infoAdder.AddMissingInformation(result); output.Add(result); } } return(output); }
public void UninstallFromDirectory(IEnumerable <ApplicationUninstallerEntry> allUninstallers) { if (!TryGetUninstallLock()) { return; } var listRefreshNeeded = false; var applicationUninstallerEntries = allUninstallers as IList <ApplicationUninstallerEntry> ?? allUninstallers.ToList(); try { var dialog = new FolderBrowserDialog { RootFolder = Environment.SpecialFolder.Desktop, Description = Localisable.UninstallFromDirectory_FolderBrowse }; if (dialog.ShowDialog(MessageBoxes.DefaultOwner) != DialogResult.OK) { return; } var items = new List <ApplicationUninstallerEntry>(); LoadingDialog.ShowDialog(MessageBoxes.DefaultOwner, Localisable.UninstallFromDirectory_ScanningTitle, _ => { items.AddRange(DirectoryFactory.TryCreateFromDirectory( new DirectoryInfo(dialog.SelectedPath), null, new string[] { })); }); if (items.Count == 0) { items.AddRange(applicationUninstallerEntries .Where(x => PathTools.PathsEqual(dialog.SelectedPath, x.InstallLocation))); } if (items.Count == 0) { MessageBoxes.UninstallFromDirectoryNothingFound(); } else { foreach (var item in items.ToList()) { if (item.UninstallPossible && item.UninstallerKind != UninstallerType.SimpleDelete && MessageBoxes.UninstallFromDirectoryUninstallerFound(item.DisplayName, item.UninstallString)) { item.RunUninstaller(false, Settings.Default.AdvancedSimulate).WaitForExit(60000); items.Remove(item); listRefreshNeeded = true; } else { var found = applicationUninstallerEntries.Where( x => PathTools.PathsEqual(item.InstallLocation, x.InstallLocation)).ToList(); if (!found.Any()) { continue; } items.Remove(item); foreach (var entry in found) { if (entry.UninstallPossible && entry.UninstallerKind != UninstallerType.SimpleDelete && MessageBoxes.UninstallFromDirectoryUninstallerFound(entry.DisplayName, entry.UninstallString)) { try { item.RunUninstaller(false, Settings.Default.AdvancedSimulate).WaitForExit(60000); } catch (Exception ex) { PremadeDialogs.GenericError(ex); } listRefreshNeeded = true; } else { items.Add(entry); } } } } AdvancedUninstall(items, applicationUninstallerEntries.Where( x => !items.Any(y => PathTools.PathsEqual(y.InstallLocation, x.InstallLocation)))); } } finally { ReleaseUninstallLock(); _lockApplication(false); if (listRefreshNeeded) { _initiateListRefresh(); } } }