private Task <PathTreeNode> CreateDirectoryTreeAsync([NotNull] IEnumerable <string> files) { var tree = new PathTreeNode(); foreach (var file in files) { var node = tree; foreach (var part in Path.GetDirectoryName(file).GetPathComponents()) { node = node.Lookup(part) ?? node.Insert(part); } node.AddFile(file); } return(Task.FromResult(tree)); }
private async Task <long> ValidateUnreachableAsync([NotNull] ILogger logger, [NotNull] PathTreeNode tree, ValidateMode mode) { logger.Info(mode == ValidateMode.Delete ? $"[{DateTime.Now:s}] Delete unreachable files{myId}..." : $"[{DateTime.Now:s}] Validating unreachable files{myId}..."); long deleted = 0; var stack = new Stack <PathTreeNode>(); stack.Push(tree); while (stack.Count > 0) { var node = stack.Pop(); if (node.HasChildren) { foreach (var child in node.Children) { stack.Push(child); } } if (!node.HasReferences) { foreach (var file in node.Files) { if (mode == ValidateMode.Delete) { logger.Info($" Deleting {file}"); Interlocked.Increment(ref deleted); await myStorage.DeleteAsync(file); } else { logger.Error($"The file {file} should be deleted as unreferenced"); if (mode == ValidateMode.Fix) { logger.Fix($"The file {file} will be deleted as unreferenced"); await myStorage.DeleteAsync(file); } } } } } return(deleted); }