Beispiel #1
0
        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));
        }
Beispiel #2
0
        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);
        }