[英]JAVA - get size of all subdirectories?
具有這種子目錄:
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 DU c:\\ test應該會產生以下輸出:
DIR C:\TEST\FOO 800KB
FILE C:\TEST\SOMEFILE.DAT 700KB
DIR C:\TEST\BAR 405KB
任何幫助將是巨大的,到目前為止我的代碼很接近,但是沒有獲得預期的輸出? :/
import java.io.File;
public class DU {
public static void main(String[] args) {
File file = new File(args[0]);
if (file.isDirectory()) {
File[] filesNames = file.listFiles();
for (File temp : filesNames) {
if (temp.isDirectory()) {
File dirs = new File(temp.getPath());
getDirSize(dirs);
} else {
System.out.println("FILE - " + temp.getPath() + " "
+ friendlyFileSize(temp.length()));
}
}
} else {
System.out.println("THIS IS NOT A FILE LOCATION!");
}
}
private static long getDirSize(File dirs) {
long size = 0;
for (File file : dirs.listFiles()) {
if (file.isFile())
size += file.length();
else
size += getDirSize(file);
}
System.out.println("DIR - " + dirs+" "+ friendlyFileSize(size));
return size;
}
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;
}
}
此代碼獲取所有子目錄的輸出,而不是顯示所有子目錄的總和並僅打印頂層目錄? 許多幫助:D
FILE - c:\test\baba.pdf (4)mb
FILE - c:\test\babdb.txt (67)kb
DIR - c:\test\one\oneone (67)kb
DIR - c:\test\one (814)kb
DIR - c:\test\two\twotwo (322)kb
DIR - c:\test\two (368)kb
您的要求是輸入一個文件夾,然后顯示該文件夾的所有文件(包括文件夾在內的文件)的大小。
我們定義的文件夾大小是該文件夾(包括子文件夾)中文件大小的總和。
因此,源代碼的過程如下:
(1)列出該文件夾的所有文件作為輸入。
(2)計算(1)中列出的文件大小。
(3)顯示文件類型(FILE OR DIR),在(1)中列出的文件的路徑以及在(2)中計算出的文件大小。
(1)和(3)的源代碼如下:
public static void showFileSizes(File dir) {
File[] files = dir.listFiles(); // (1)
long[] fileSizes = new long[files.length];
for(int i = 0; i < files.length; i++) {
fileSizes[i] = calculateFileSize(file[i]);//invoke the method corresponding to (2).
boolean isDirectory = files[i].isDirectory();
System.out.println(((isDirectory)?"DIR":"FILE") + " - " + files[i].getAbsolutePath() + friendlyFileSize(fileSizes[i]));// as (3)
}
}
(2)的源代碼如下:
public static long calculateFileSize(File file) {
long fileSize = 0L;
if(file.isDirectory()) {
File[] children = file.listFiles();
for(File child : children) {
fileSize += calculateFileSize(child);
}
}
else {
fileSize = file.length();
}
return fileSize;
}
您唯一要做的就是調用showFileSizes方法。
通過使用Java 7新的File I / O NIO.2框架(通常通過使用Files.walkFileTree(Path,Set,int,FileVisitor)方法),這非常容易。
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;
import java.util.concurrent.atomic.AtomicLong;
public class Main {
private static class PrintFiles extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
if (attr.isDirectory()) {
try {
System.out.format("Directory: %s, size: %d bytes\n", file, getDirSize(file));
} catch (IOException e) {
e.printStackTrace();
}
} else if (attr.isRegularFile()) {
System.out.format("Regular file: %s, size %d bytes\n", file, attr.size());
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println(exc);
return FileVisitResult.CONTINUE;
}
/**
* Walks through directory path and sums up all files' sizes.
*
* @param dirPath Path to directory.
* @return Total size of all files included in dirPath.
* @throws IOException
*/
private long getDirSize(Path dirPath) throws IOException {
final AtomicLong size = new AtomicLong(0L);
Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
size.addAndGet(attrs.size());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
//just skip
return FileVisitResult.CONTINUE;
}
});
return size.get();
}
}
/**
* Main method.
*
* @param args
*/
public static void main(String [] args) {
Path p = Paths.get("d:\\octopress");
try {
Files.walkFileTree(p, EnumSet.noneOf(FileVisitOption.class), 1, new PrintFiles());
} catch (IOException e) {
e.printStackTrace();
}
}
}
緊跟已經完成的工作,每次遇到目錄時,都必須增加目錄大小。
for (File temp : filesNames) {
if (temp.isDirectory()) {
dirs = new File(temp.getPath());
heavy += getDirSize(dirs);
} else {
System.out.println("FILE - " + temp.getPath() + " "
+ friendlyFileSize(temp.length()));
}
}
您還希望將大小與子目錄的父項相加后顯示大小
public static void main(String[] args) {
...
...
System.out.println("DIR - " + dirs.getParent() + " "
+ friendlyFileSize(heavy));
}
另外,您需要檢查目錄中是否有文件,否則dirs.listFiles()
會導致NPE
private static long getDirSize(File dirs) {
long size = 0;
if (dirs != null && dirs.listFiles() != null) {
for (File file : dirs.listFiles()) {
if (file.isFile())
size += file.length();
else
size += getDirSize(file);
}
}
return size;
}
您的整個代碼略有修改:
public class SubDirs {
static long heavy;
public static void main(String[] args) {
File file = new File("C:\\Program Files");
File dirs = null;
if (file.isDirectory()) {
File[] filesNames = file.listFiles();
for (File temp : filesNames) {
if (temp.isDirectory()) {
dirs = new File(temp.getPath());
heavy += getDirSize(dirs);
} else {
System.out.println("FILE - " + temp.getPath() + " "
+ friendlyFileSize(temp.length()));
}
}
} else {
System.out.println("THIS IS NOT A FILE LOCATION!");
}
System.out.println("DIR - " + dirs.getParent() + " "
+ friendlyFileSize(heavy));
}
private static long getDirSize(File dirs) {
long size = 0;
if (dirs != null && dirs.listFiles() != null) {
for (File file : dirs.listFiles()) {
if (file.isFile())
size += file.length();
else
size += getDirSize(file);
}
}
return size;
}
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;
}
}
使用FileUtils.sizeOfDirectory()使它簡短而簡單。 為此,您必須導入org.apache.commons.io.FileUtils。
if (temp.isDirectory()) {
File dirs = new File(temp.getPath());
System.out.println("DIR - " + dirs+" "+ friendlyFileSize(FileUtils.sizeOfDirectory(dirs)));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.