コード例 #1
0
ファイル: FolderTrimmer.cs プロジェクト: zmyer/service-fabric
        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);
            }
        }
コード例 #2
0
ファイル: FolderTrimmer.cs プロジェクト: zmyer/service-fabric
        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);
        }
コード例 #3
0
ファイル: FolderTrimmer.cs プロジェクト: zmyer/service-fabric
        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;
                        }
                    }
                }
            }
        }