Есть небольшая ошибка с простой рекурсивной итерацией по всем подпапкам.В некоторых файловых системах возможно создание круговых структур каталогов с использованием символических ссылок, как показано ниже:
mkdir -- parents father/son
ln -sf ${PWD}/father father/son
ls father/son/father/son/father/son/father/son/
Для защиты от этой ошибки вы можете использовать метод java.io.File # getCanonicalPath.Код ниже является небольшой модификацией предыдущего ответа .
public static long getFileSize(File folder) throws IOException {
return ( getFileSize ( folder , new HashSet < String > ( ) ) ) ;
}
public static long getFileSize(File folder, Set<String> history)
throws IOException {
long foldersize = 0;
File[] filelist = folder.listFiles();
for (int i = 0; i < filelist.length; i++) {
System.err.println("HISTORY");
System.err.println(history);
boolean inHistory = history.contains(filelist[i].getCanonicalPath());
history.add(filelist[i].getCanonicalPath());
if (inHistory) {
// skip it
} else if (filelist[i].isDirectory()) {
foldersize += getFileSize(filelist[i], history);
} else {
foldersize += filelist[i].length();
}
}
return foldersize;
}