【发布时间】: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