示例#1
0
        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());
        }
示例#2
0
        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());
        }