【问题标题】:How to properly display directory tree如何正确显示目录树
【发布时间】:2021-08-08 06:30:46
【问题描述】:

我创建了一个打印目录树的程序,带有文件夹大小。

这是我的代码:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;

public class FileTreeImpl implements App.FileTree {

@Override
public Optional<String> tree(Path path)
{
    if(path !=null){
        if(isDir(path)){
            File folder = new File(path.toString());
            try {
                return Optional.of(renderFolder(folder, 0, new StringBuilder(), false).toString());
            } catch (IOException e) {

            }
        }else{
            try {
                long size = Files.size(path);
                int lastIndex = 0;
                for (int i = 0; i < path.toString().length(); i++) {
                    if(path.toString().charAt(i)=='\\'){
                        lastIndex=i;
                    }
                }
                String result = path.toString().substring(lastIndex+1) + " " + size + " bytes";
                return Optional.of(result);
            } catch (IOException e) {

            }
        }
    }
    return Optional.empty();
}

static Boolean isDir(Path path) {
    if (path == null || !Files.exists(path)) return false;
    else return Files.isDirectory(path);
}

private static StringBuilder renderFolder(File folder, int level, StringBuilder sb, boolean isLast) throws IOException {

    long size = Files.walk(folder.toPath()).mapToLong( p -> p.toFile().length() ).sum();

    indent(sb, level, isLast).append(" ").append(folder.getName()).append(" " + size + " bytes").append("\n");

    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);
        }
        else
        {
            renderFile(objects[i], level + 1, sb, last);
        }
    }

    return sb;
}

private static StringBuilder renderFile(File file, int level, StringBuilder sb, boolean isLast)
{
    return indent(sb, level, isLast).append(" ").append(file.getName()).append(" " + file.length() + " bytes").append("\n");
}

private static StringBuilder indent(StringBuilder sb, int level, boolean isLast)
{
    for (int i = 1; i < level; i++)
    {
        sb.append("│  ");
    }
    if (level > 0)
    {
        sb.append(isLast
                ? "└─"
                : "├─");
    }
    return sb;
}}

所以该程序适用于少数情况,但对于其中一些情况来说,它是相当错误的。

例如正确的输出应该是:

但是我的输出是:

另一个正确输出的例子:

我的输出:

那么,我该如何修复这个错误呢?问题出在哪里?

P.S 这个话题print directory tree 帮了我很多,但是我还是做不好。

【问题讨论】:

  • 只是对事物的排序方式与您对它们的排序方式不同。
  • 是的,但我做得不对,我不明白如何解决它。我已经尝试了很多事情stackoverflow.com/questions/10655085/print-directory-tree 这个话题帮助了我很多但是我仍然无法正确地做到这一点

标签: java file directory io tree


【解决方案1】:

你的陈述

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

每个级别打印一个垂直条。但是在给定级别打印"└─" 之后,您不得在后续行中在该级别打印任何竖线,直到在该级别打印新文件夹或文件名之后。

【讨论】:

  • 试过了,但不成功,不明白在这种情况下我该如何解决。
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 2020-01-06
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多