当前位置: 首页 > 知识库问答 >
问题:

列出文件夹和文件

屠德宇
2023-03-14
    public static void main(String[] args) throws Exception {
    File root = new File("C:\\Users\\resti\\Desktop\\example");
    if (!root.isDirectory())
    {
        System.out.println("some_text");
    }

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

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

    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
                ? "\u2514\u2500\u2500"
                : "\u251c\u2500\u2500");
    }

    return sb;
}
}

它可以工作,很酷,但问题是它不能计算正常的文件,如。txt或。png...我知道它写在这个方法中,但idk如何修复它而不破坏其他一切

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

我可以重做这个方法吗?(此代码不是我的https://stackoverflow.com/a/33438475/13547682)

共有1个答案

谭勇
2023-03-14

假设我理解你的问题,这是我的回答:

在给定的代码中:

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

您正在筛选文件夹中找到的所有文件,并检查给定文件是否为。isDirectory()目录。因此,结果数组仅由文件夹组成。

File[] objects = folder.listFiles();

因此:

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

    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 renderFolder(File folder, int level, StringBuilder sb, boolean isLast, List<Boolean> hierarchyTree) {
        indent(sb, level, isLast, hierarchyTree).append(folder.getName()).append("\n");

        File[] objects = folder.listFiles();

        for (int i = 0; i < objects.length; i++) {
            boolean last = ((i + 1) == objects.length);
            hierarchyTree.add(i != objects.length - 1);
            if (objects[i].isDirectory() == false) {
                indent(sb, level, isLast, hierarchyTree).append(objects[i].getName()).append("\n");
                hierarchyTree.remove(hierarchyTree.size() - 1);
                continue;
            }
            // this means if the current folder will still need to print subfolders at this level, if yes, then we need to continue print |
            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;
}

重要的变化是,如果数组中的对象不是文件夹,则调用indent函数,然后继续循环,而不调用当前文件对象上的renderFolder。

if (objects[i].isDirectory() == false) {
        indent(sb, level, isLast, hierarchyTree).append(objects[i].getName()).append("\n");
        hierarchyTree.remove(hierarchyTree.size() - 1);
        continue;
}
└──62476474
    ├──target
    │   ├──generated-sources
    │   │   └──annotations
    │   ├──classes
    │   │   ├──Main.class
    │   └──maven-status
    │       └──maven-compiler-plugin
    │           └──compile
    │               └──default-compile
    │                   └──inputFiles.lst
    │                   └──createdFiles.lst
    └──pom.xml
    └──src
        ├──test
        │   └──java
        └──main
            └──java
                └──Main.java
 类似资料:
  • 我想使用JGit显示头部修订版的所有文件和文件夹的列表。我可以使用 TreeWalk 列出所有文件,但这不会列出文件夹。 以下是我到目前为止的情况:

  • 我是Android系统的新手。我得到了一个应用程序,在其中我列出了所有SD文件和文件夹,包括doc,pdf,xls,jpg等。 如何在Android中以编程方式获取我的SD卡中所有文件夹和文件的文件夹名和文件名? 我正在使用这段代码,但无法获得文件夹名称(根文件夹和子文件夹)。

  • 问题内容: 请给我一个使用php列出目录中所有文件夹,子文件夹,文件的解决方案。我的文件夹结构是这样的: 我想获取每个文件夹内所有文件的列表。 php中有任何shell脚本命令吗? 问题答案:

  • 问题内容: 我如何返回一个包含该文件夹中的所有文件以及子文件夹的文件数组,我的方法仅适用于该文件夹,并且不包括子文件夹。 问题答案: 使用您当前的代码,进行以下调整:

  • 这可以通过元数据实现吗?当在父文件夹中创建一个新文件/文件夹时,我是否也可以通过编程方式更新父文件夹的元数据,以便说:“嘿,在这个文件夹中有这些特定的文件?”

  • 获取指定的文件或文件夹,每次一个。 Loop, FilePattern [, IncludeFolders?, Recurse?] 参数 FilePattern 单个文件或文件夹的名称或者通配符模式,例如 C:\Temp\*.tmp。如果未指定绝对路径则假定 FilePattern 在 %A_WorkingDir%。 支持星号和问号作为通配符使用. 当模式出现在文件的长/普通名称或其 8.3 短名