像树命令一样打印目录 [英] print directory like tree command

查看:16
本文介绍了像树命令一样打印目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我必须打印目录树.我有以下代码:

I have to print a directory tree. I have the following code:

public static void main(String[] args) throws Exception
{

  File root = new File("C:\Users\User\Desktop\example");

  if (!root.isDirectory())
  {
    throw new IllegalArgumentException("Invalid directory: " + root.getName());
  }

  int level = 0;
  System.out.println(renderFolder(root, level, new StringBuilder(), false));
}

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast)
{
  indent(sb, level, isLast).append(folder.getName()).append("
");

  File[] objects = folder.listFiles();

  for (int i = 0; i < objects.length; i++)
  {
    boolean last = ((i + 1) == objects.length);

    if (objects[i].isDirectory())
    {
      renderFolder(objects[i], level + 1, sb, last);
    }
  }
  return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast)
{

  for (int i = 1; i < level; i++)
  {
     sb.append("u2502   ");
  }

  if (level > 0)
  {
    sb.append(isLast
      ? "u2514u2500u2500"
      : "u251cu2500u2500");
  }

  return sb;
}

使用此输出:

example
├──a
└──b
│   └──b1
│   │   ├──b11
│   │   │   └──b111
│   │   └──b12
│   │   │   ├──b121
│   │   │   └──b122
│   │   │   │   └──b1221

我没能去除无用的深纹.如何做到这一点?
另外我的回答是:如何保持线路连接(与 cmd 的树命令一样多)?"

I didn't manage to remove the useless deep lines. How to do this?
Also my answer is: "How can I keep lines connected(as much as the cmd's tree command)?"

推荐答案

试试这个,我在你的方法中添加了另一个参数,称为hierarchyTree 来指示是否在某个级别,我们应该打印 |或空白区域.

Try this one, I added another parameter into your methods called hierarchyTree to indicate if at a certain level, we should print | or empty space.

用作堆栈,可以根据递归级别轻松维护文件夹级别.

It is used as a stack to easily maintain the folder levels based on the recursion level.

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
    indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("
");

    File[] objects = folder.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isDirectory();
        }
    });

    for (int i = 0; i < objects.length; i++) {
        boolean last = ((i + 1) == objects.length);

        // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
        hierarchyTree.add(i != objects.length - 1);
        renderFolder(objects[i], level + 1, sb, last, hierarchyTree);

        // pop the last value as we return from a lower level to a higher level
        hierarchyTree.remove(hierarchyTree.size() - 1);
    }
    return sb;
}


private static StringBuilder indent(StringBuilder sb, int level, boolean isLast, List<Boolean> hierarchyTree) {
    String indentContent = "u2502   ";
    for (int i = 0; i < hierarchyTree.size() - 1; ++i) {
        // determines if we need to print | at this level to show the tree structure
        // i.e. if this folder has a sibling foler that is going to be printed later
        if (hierarchyTree.get(i)) {
            sb.append(indentContent);
        } else {
            sb.append("    "); // otherwise print empty space
        }
    }

    if (level > 0) {
        sb.append(isLast
                ? "u2514u2500u2500"
                : "u251cu2500u2500");
    }

    return sb;
}

示例结果:

example
├──a
├──b
│   └──b1
│       ├──b11
│       │   └──b111
│       └──b12
│           ├──b121
│           └──b122
│               └──b1221
└──c

这篇关于像树命令一样打印目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆