例如,如果我的计算机上有一个目录 c:\test 包含以下内容 目录和文件:
C:\test\foo\a.dat (100kb)
C:\test\foo\b.dat (200kb)
C:\test\foo\another_dir\jim.dat (500kb)
C:\test\bar\ball.jpg (5kb)
C:\test\bar\sam\sam1.jpg (100kb)
C:\test\bar\sam\sam2.jpg (300kb)
C:\test\somefile.dat (700kb)
运行命令 java ClassName c:\test 我想要这样的输出,按大小从大到小排序?:
目录 C:\TEST\FOO 800KB
文件 C:\TEST\SOMEFILE.DAT 700KB
目录 C:\TEST\BAR 405KB
Path startPath = Paths.get("C:\\test");
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
System.out.println("Dir: " + dir.toString() + " "+getFolderSize(path()));
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("File: " + file.toString());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException e) {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
到目前为止,我得到的这一部分可以生成所有文件和目录的输出(这不是我想要的)并且没有大小?有没有人帮忙下一步该怎么做?
谢谢!
最佳答案
我想你想要这样的东西(以字节为单位输出):
import java.io.File;
public class FileSearcher {
public static void main(String[] args) {
File f = new File("C:\\test");
FileSearcher.search(f);
}
public static void search(File f) {
if(null == f) {
return;
}
System.out.print("| " + f.getAbsolutePath());
if(f.isFile()) {
System.out.print(" (" + f.length() + ")");
} else if(f.isDirectory()) {
File[] children = f.listFiles();
if(null != children) {
for(File c : children) {
search(c);
}
}
}
System.out.println("");
}
}
哦,如果你碰巧关心人类友好的文件大小,像这样的东西会为你转换它们(只需将 f.length() 更改为 friendlyFileSize(f.length()):
public static String friendlyFileSize(long size) {
String unit = "bytes";
if(size > 1024) {
size = size / 1024;
unit = "kb";
}
if(size > 1024) {
size = size / 1024;
unit = "mb";
}
if(size > 1024) {
size = size / 1024;
unit = "gb";
}
return size + " " + unit;
}
关于Java - 路径+大小内的子目录和文件列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20889571/