private async Task ValidateAndDeleteUnreachableAsync()

in Core/src/Impl/Commands/StorageManager.cs [418:459]


    private async Task<long> ValidateAndDeleteUnreachableAsync(ILogger logger, PathTree 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.Root);
      while (stack.Count > 0)
      {
        var node = stack.Pop();
        if (node.HasChildren)
        {
          foreach (var child in node.GetChildren())
            stack.Push(child);
        }

        if (!node.HasReferences)
        {
          foreach (var file in node.GetFiles())
          {
            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;
    }