protected void SetupMockPurger() { var file1 = new FileInfoMocker() .ApplyFullName("File1Full") .ApplyName("File1"); var file2 = new FileInfoMocker() .ApplyFullName("File2Full") .ApplyName("File2"); var files = new List <IFileInfo>(2) { // these are not sorted correctly file2.GetMockedFileInfo(), file1.GetMockedFileInfo() }; var dir1 = new DirectoryInfoMocker() .ApplyFullName("Dir1Full"); var dir2 = new DirectoryInfoMocker() .ApplyFullName("Dir2Full"); A.CallTo(() => MockEpisodePurger.FindEpisodesToPurge(SOURCE_ROOT, podcast1Mocker.GetMockedPodcastInfo())).Returns(files); A.CallTo(() => MockEpisodePurger.FindEmptyFoldersToDelete(SOURCE_ROOT, podcast1Mocker.GetMockedPodcastInfo(), A <IList <IFileInfo> > .Ignored)).Returns(dir1.GetMockedDirectoryInfoAsList()); A.CallTo(() => MockEpisodePurger.FindEmptyFoldersToDelete(SOURCE_ROOT, podcast2Mocker.GetMockedPodcastInfo(), A <IList <IFileInfo> > .Ignored)).Returns(dir2.GetMockedDirectoryInfoAsList()); }
static void Main(string[] args) { DisplayBanner(); if (args.Length < 1) { DisplayHelp(); return; } _iocContainer = InitializeIocContainer(); _control = new ReadOnlyControlFile(args[0]); if (args.Count() > 1) { _quiet = args[1].Contains('q'); } // find the episodes to delete List <IFileInfo> allFilesToDelete = new List <IFileInfo>(20); IEpisodePurger podcastEpisodePurger = _iocContainer.Resolve <IEpisodePurger>(); foreach (PodcastInfo podcastInfo in _control.GetPodcasts()) { IList <IFileInfo> filesToDeleteFromThisFeed = podcastEpisodePurger.FindEpisodesToPurge(_control.GetSourceRoot(), podcastInfo); allFilesToDelete.AddRange(filesToDeleteFromThisFeed); } // find folders that can now be deleted List <IDirectoryInfo> allFoldersToDelete = new List <IDirectoryInfo>(10); foreach (PodcastInfo podcastInfo in _control.GetPodcasts()) { IList <IDirectoryInfo> foldersToDeleteInThisFeed = podcastEpisodePurger.FindEmptyFoldersToDelete(_control.GetSourceRoot(), podcastInfo, allFilesToDelete); allFoldersToDelete.AddRange(foldersToDeleteInThisFeed); } if (allFilesToDelete.Count == 0 && allFoldersToDelete.Count == 0) { Console.WriteLine("There is nothing to delete"); return; } if (_quiet) { DoDelete(allFilesToDelete, allFoldersToDelete); } else { if (allFilesToDelete.Count > 0) { Console.WriteLine("Files:"); foreach (IFileInfo fileInfo in allFilesToDelete) { Console.WriteLine("{0}", fileInfo.FullName); } } if (allFoldersToDelete.Count > 0) { Console.WriteLine("Folders:"); foreach (IDirectoryInfo folder in allFoldersToDelete) { Console.WriteLine("{0}", folder.FullName); } } Console.WriteLine("OK to delete {0} files and {1} folders? (y/n) ", allFilesToDelete.Count, allFoldersToDelete.Count); string answer; do { char key = Convert.ToChar(Console.Read()); answer = key.ToString().ToLower(); } while (answer != "y" && answer != "n"); if (answer == "y") { Console.WriteLine("Deleting {0} files and {1} folders", allFilesToDelete.Count, allFoldersToDelete.Count); DoDelete(allFilesToDelete, allFoldersToDelete); } else { Console.WriteLine("No files deleted"); } } Console.WriteLine("Done"); }
public void FindItemsToDelete() { var controlFile = ApplicationControlFileProvider.GetApplicationConfiguration(); Logger.Debug(() => $"PurgeViewModel:FindItemsToDelete"); if (controlFile == null) { Logger.Warning(() => $"PurgeViewModel:FindItemsToDelete - no control file"); return; } lock (SyncLock) { if (StartedFindingItems) { Logger.Warning(() => $"PurgeViewModel:FindItemsToDelete - ignoring, already initialised"); if (CompletedFindingItems) { Observables.SetPurgeItems?.Invoke(this, AllItems); SetTitle(); } else { // we scan each feed twice Observables.StartProgress?.Invoke(this, FeedCount * 2); } return; } StartedFindingItems = true; } foreach (var item in controlFile.GetPodcasts()) { FeedCount++; } Observables.StartProgress?.Invoke(this, FeedCount * 2); // find the items to delete AllItems.Clear(); int count = 0; // find the episodes to delete List <IFileInfo> allFilesToDelete = new List <IFileInfo>(20); foreach (var podcastInfo in controlFile.GetPodcasts()) { IList <IFileInfo> filesToDeleteFromThisFeed = EpisodePurger.FindEpisodesToPurge(controlFile.GetSourceRoot(), podcastInfo); List <IFileInfo> sortedFileList = filesToDeleteFromThisFeed.OrderBy(item => item.Name).ToList(); foreach (var file in sortedFileList) { var line = $"File: {file.FullName}"; Logger.Debug(() => $"PurgeViewModel:FindItemsToDelete {line}"); var item = new PurgeRecyclerItem() { FileOrDirectoryItem = file, Selected = true }; // this is for the recycler adapter AllItems.Add(item); } // and this is so we can work out which folder will be empty allFilesToDelete.AddRange(filesToDeleteFromThisFeed); count++; Observables.UpdateProgress?.Invoke(this, count); } // find folders that can now be deleted foreach (var podcastInfo in controlFile.GetPodcasts()) { IList <IDirectoryInfo> foldersToDeleteInThisFeed = EpisodePurger.FindEmptyFoldersToDelete(controlFile.GetSourceRoot(), podcastInfo, allFilesToDelete); List <IDirectoryInfo> sortedDirList = foldersToDeleteInThisFeed.OrderBy(item => item.FullName).ToList(); foreach (var dir in sortedDirList) { var line = $"Dir: {dir.FullName}"; Logger.Debug(() => $"PurgeViewModel:FindItemsToDelete {line}"); var item = new PurgeRecyclerItem() { FileOrDirectoryItem = dir, Selected = true }; AllItems.Add(item); } count++; Observables.UpdateProgress?.Invoke(this, count); } CompletedFindingItems = true; Observables.EndProgress?.Invoke(this, null); Observables.SetPurgeItems?.Invoke(this, AllItems); SetTitle(); AnalyticsEngine.PurgeScanEvent(GetItemsSelectedCount()); }