Example #1
0
        private bool AddSubFoldersToQueueWorker(object context)
        {
            SubFolderEnumerationData enumData = (SubFolderEnumerationData)context;
            string folder = enumData.FolderInfo.FolderName;
            Queue <FolderDeletionInfo>   folderQueue = enumData.FolderQueue;
            SetFolderDeletionInfoContext setContext  = enumData.SetContext;

            if (false == FabricDirectory.Exists(folder))
            {
                // Directory does not exist. Nothing more to be done here.
                return(true);
            }

            // Create a DirectoryInfo object representing the current folder
            DirectoryInfo dirInfo = new DirectoryInfo(folder);

            // Add the current folder's sub-folders to the queue
            IEnumerable <DirectoryInfo> subFolders = dirInfo.EnumerateDirectories();

            foreach (DirectoryInfo subFolder in subFolders)
            {
                if (this.stopping)
                {
                    this.traceSource.WriteInfo(
                        this.logSourceId,
                        "The consumer is being stopped. Therefore, enumeration of subfolders of folder {0} during old file deletion was interrupted.",
                        folder);
                    break;
                }

                FolderDeletionInfo subFolderInfo = new FolderDeletionInfo();
                subFolderInfo.FolderName = subFolder.FullName;
                subFolderInfo.Context    = null;
                if (null != setContext)
                {
                    setContext(subFolderInfo, enumData.FolderInfo, subFolder.Name);
                }

                folderQueue.Enqueue(subFolderInfo);
            }

            return(true);
        }
Example #2
0
        private void GetSubFoldersToDelete(
            string folder,
            DestinationOperationPerformer destinationOperationPerformer,
            SetFolderDeletionInfoContext setContext,
            out List <FolderDeletionInfo> folderList)
        {
            // Do a breadth-first traversal of the folder and make a list of all
            // subfolders (including itself)
            folderList = new List <FolderDeletionInfo>();

            FolderDeletionInfo folderInfo = new FolderDeletionInfo();

            folderInfo.FolderName = folder;
            folderInfo.Context    = null;
            if (null != setContext)
            {
                setContext(folderInfo, null, null);
            }

            Queue <FolderDeletionInfo> folderQueue = new Queue <FolderDeletionInfo>();

            folderQueue.Enqueue(folderInfo);

            bool enumerationInterruptedDueToStop = false;

            while (folderQueue.Count != 0)
            {
                if (this.stopping)
                {
                    enumerationInterruptedDueToStop = true;
                    break;
                }

                folderInfo = folderQueue.Dequeue();
                folderList.Add(folderInfo);

                SubFolderEnumerationData enumData = new SubFolderEnumerationData();
                enumData.DestinationOperationPerformer = destinationOperationPerformer;
                enumData.FolderInfo  = folderInfo;
                enumData.FolderQueue = folderQueue;
                enumData.SetContext  = setContext;
                try
                {
                    Utility.PerformIOWithRetries(
                        this.AddSubFoldersToQueue,
                        enumData);
                }
                catch (Exception e)
                {
                    this.traceSource.WriteExceptionAsError(
                        this.logSourceId,
                        e,
                        "Unable to enumerate subfolders of folder {0} while attempting to delete old files.",
                        folderInfo.FolderName);
                }
            }

            if (enumerationInterruptedDueToStop)
            {
                this.traceSource.WriteInfo(
                    this.logSourceId,
                    "The consumer is being stopped. Therefore, enumeration of files to delete from folder {0} was interrupted.",
                    folder);
                folderList.Clear();
                return;
            }

            // Now we have a list of folders, top-down. However, we want to
            // process the folders bottom-up, so that the folders themselves
            // can be deleted if they become empty. So let's reverse the list.
            folderList.Reverse();
        }