/// <summary> /// Deteltes items from depth-first items collection. /// This operation WILL FAIL if collection is not ordered depth-first. /// </summary> /// <param name="items">Depth-first file system items collection.</param> /// <param name="force">Set true to remove read-only items.</param> /// <returns>True if all items were removed.</returns> private bool Delete(IEnumerable <IItem> items, bool force = false) { ProgressEventArgs currentProgress = null; if (ReportProgress) { currentProgress = new ProgressEventArgs(items.Count(), CalculateSize ? items.Sum(i => i.Size) : 0); } bool success = true; foreach (var item in items) { try { if (item.FileSystem.RemoveItem(item.Path, force)) { if (ReportProgress) { currentProgress.Item++; if (CalculateSize) { currentProgress.Bytes += item.Size; } (Progress as IProgress <ProgressEventArgs>).Report(currentProgress); } } else { success = false; Deferred.Add(item); } } catch (Exception x) { success = false; Deferred.Add(item); Errors.Add(new Error(item.Path, x.Message)); } } return(success); }
/// <summary> /// Deletes a file system item with all optional subitems if applicable. /// </summary> /// <param name="item">File or directory item.</param> /// <param name="force">Set true to remove read-only items.</param> /// <returns>True if all items were removed.</returns> private bool Delete(IItem item, bool force = false) { ProgressEventArgs currentProgress = null; if (item.FileSystem.IsReadOnly || !item.FileSystem.CanRemoveItems) { return(false); } if (!item.FileSystem.Exists(item.Path)) { return(false); } if (item.IsFile) { try { return(item.FileSystem.RemoveItem(item.Path, force)); } catch (Exception x) { Errors.Add(new Error(item.Path, x.Message)); return(false); } } if (item.IsDirectory) { var node = item.GetNode(); bool success = true; if (ReportProgress) { currentProgress = new ProgressEventArgs(node.TotalCount, CalculateSize ? node.DescendantFiles.Sum(i => i.Size) : 0); } foreach (var leaf in node.Descendants) { try { if (leaf.FileSystem.RemoveItem(leaf.Path, force)) { if (ReportProgress) { currentProgress.Item++; if (CalculateSize) { currentProgress.Bytes += leaf.Size; } (Progress as IProgress <ProgressEventArgs>).Report(currentProgress); } } else { Deferred.Add(leaf); } } catch (Exception x) { success = false; Deferred.Add(leaf); Errors.Add(new Error(leaf.Path, x.Message)); } } try { node.FileSystem.RemoveItem(node.Path, force); } catch (Exception x) { success = false; Deferred.Add(node); Errors.Add(new Error(node.Path, x.Message)); } return(success); } return(false); }