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); }
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(); }