Beispiel #1
0
        private void DeleteFilesFromFolder(object context)
        {
            DeleteFilesData data   = (DeleteFilesData)context;
            string          folder = data.FolderInfo.FolderName;
            DestinationOperationPerformer destinationOperationPerformer = data.DestinationOperationPerformer;

            if (null != destinationOperationPerformer)
            {
                // Folder is at the destination. So we might need to impersonate.
                destinationOperationPerformer(
                    this.DeleteFilesFromFolderWorker,
                    context);
            }
            else
            {
                // Folder is not at the destination. No need to impersonate.
                this.DeleteFilesFromFolderWorker(context);
            }
        }
Beispiel #2
0
        private void AddSubFoldersToQueue(object context)
        {
            SubFolderEnumerationData enumData = (SubFolderEnumerationData)context;
            string folder = enumData.FolderInfo.FolderName;
            DestinationOperationPerformer destinationOperationPerformer = enumData.DestinationOperationPerformer;

            if (null != destinationOperationPerformer)
            {
                // Folder is at the destination. So we might need to impersonate.
                destinationOperationPerformer(
                    this.AddSubFoldersToQueueWorker,
                    context);
            }
            else
            {
                // Folder is not at the destination. No need to impersonate.
                this.AddSubFoldersToQueueWorker(context);
            }
        }
Beispiel #3
0
        internal void DeleteOldFilesFromFolder(
            string folder,
            SetFolderDeletionInfoContext setContext,
            IsOkToDeleteFile isOkToDelete,
            DestinationOperationPerformer destinationOperationPerformer)
        {
            this.traceSource.WriteInfo(
                this.logSourceId,
                "Starting deletion of old files in directory {0} ...",
                folder);

            List <FolderDeletionInfo> folderList;

            this.GetSubFoldersToDelete(folder, destinationOperationPerformer, setContext, out folderList);
            this.DeleteFilesFromSubFolders(folder, destinationOperationPerformer, folderList, isOkToDelete);

            this.traceSource.WriteInfo(
                this.logSourceId,
                "Finished deletion of old logs in directory {0}.",
                folder);
        }
Beispiel #4
0
        private void DeleteFilesFromSubFolders(
            string folder,
            DestinationOperationPerformer destinationOperationPerformer,
            List <FolderDeletionInfo> folderList,
            IsOkToDeleteFile isOkToDelete)
        {
            // Figure out the timestamp before which all files will be deleted
            DateTime cutoffTime = DateTime.UtcNow.Add(-this.fileDeletionAge);

            foreach (FolderDeletionInfo folderInfo in folderList)
            {
                if (this.stopping)
                {
                    this.traceSource.WriteInfo(
                        this.logSourceId,
                        "The consumer is being stopped. Therefore, no more files from folder {0} will be deleted.",
                        folder);
                    break;
                }

                DeleteFilesData deletionData = new DeleteFilesData();
                deletionData.DestinationOperationPerformer = destinationOperationPerformer;
                deletionData.FolderInfo   = folderInfo;
                deletionData.CutoffTime   = cutoffTime;
                deletionData.IsOkToDelete = isOkToDelete;
                try
                {
                    Utility.PerformIOWithRetries(
                        this.DeleteFilesFromFolder,
                        deletionData);
                }
                catch (Exception e)
                {
                    this.traceSource.WriteExceptionAsError(
                        this.logSourceId,
                        e,
                        "Unable to enumerate files in folder {0} while attempting to delete old files.",
                        folderInfo.FolderName);
                    continue;
                }

                if (null != this.OnFolderEnumerated)
                {
                    this.OnFolderEnumerated(this, EventArgs.Empty);
                }

                // We want to delete the directory if it is empty and if it is
                // not the root directory.
                if (false == folder.Equals(
                        folderInfo.FolderName,
                        StringComparison.OrdinalIgnoreCase))
                {
                    // This is not the root directory. Try to delete it. If the
                    // directory is not empty, an IOException is thrown. We handle
                    // the exception and move on.
                    try
                    {
                        DirectoryDeletionInfo delInfo = new DirectoryDeletionInfo()
                        {
                            DirName = folderInfo.FolderName, CutoffTime = cutoffTime
                        };
                        if (null != destinationOperationPerformer)
                        {
                            // Folder is at the destination. So we might need to impersonate.
                            destinationOperationPerformer(
                                this.DeleteDirectoryAtDestination,
                                delInfo);
                        }
                        else
                        {
                            // Folder is not at the destination. No need to impersonate.
                            this.DeleteDirectoryIfOld(delInfo);
                        }

                        if (null != this.OnFolderDeleted)
                        {
                            this.OnFolderDeleted(this, EventArgs.Empty);
                        }
                    }
                    catch (Exception e)
                    {
                        if (false == ((e is FabricException) || (e is IOException)))
                        {
                            throw;
                        }
                    }
                }
            }
        }
Beispiel #5
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();
        }