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); }
private bool DeleteFilesFromFolderWorker(object context) { DeleteFilesData data = (DeleteFilesData)context; string folder = data.FolderInfo.FolderName; DateTime cutoffTime = data.CutoffTime; IsOkToDeleteFile isOkToDelete = data.IsOkToDelete; if (false == FabricDirectory.Exists(folder)) { // Directory does not exist. Nothing more to be done here. return(true); } // Iterate over the files in the current folder and figure out which // ones need to be deleted DirectoryInfo dirInfo = new DirectoryInfo(folder); IEnumerable <FileInfo> files = dirInfo.EnumerateFiles().Where(file => file.LastWriteTimeUtc.CompareTo(cutoffTime) < 0); foreach (FileInfo file in files) { 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; } if (null != this.OnFileEnumerated) { this.OnFileEnumerated(this, EventArgs.Empty); } if ((null != isOkToDelete) && (false == isOkToDelete(data.FolderInfo, file.Name))) { continue; } try { Utility.PerformIOWithRetries( () => { if (null != OnPreFileDeletion) { OnPreFileDeletion(this, EventArgs.Empty); } FabricFile.Delete(file.FullName); if (null != OnPostFileDeletion) { OnPostFileDeletion(this, EventArgs.Empty); } }); } catch (Exception e) { this.traceSource.WriteExceptionAsError( this.logSourceId, e, "Failed to delete file {0}.", file.FullName); } } return(true); }
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; } } } } }